LINQ 中常用的方法逐一进行举例说明
1. Where(筛选元素)
3. Skip(跳过前 N 个元素)
5. SkipLast & TakeLast(跳过 / 获取最后 N 个元素)
6. SkipWhile & TakeWhile(条件跳过 / 获取)
7. Select(投影转换)
8. Select with index(带索引的投影)
9. SelectMany(展平集合)
var groups = new List<List<int>> { new() { 1, 2 }, new() { 3, 4 } }; // 展平并标记原组索引 var result = groups.SelectMany((group, groupIndex) => group.Select(num => $"(组{groupIndex}): {num}") ); // 结果:"(组0): 1", "(组0): 2", "(组1): 3", "(组1): 4"
11. Cast(强制类型转换)
var mixed = new ArrayList { 1, 2, 3 }; // 强制转换为int(若有非int元素会抛InvalidCastException) var ints = mixed.Cast<int>(); // 结果:1, 2, 3
12. Chunk(拆分序列为块)
13. Deferred Execution vs Immediate Execution(延迟执行 vs 立即执行)
var numbers = new List<int> { 1, 2, 3 }; // 延迟执行:此时未计算 var query = numbers.Where(n => n > 1); numbers.Add(4); // 修改源集合 var result = query.ToList(); // 立即执行:此时才计算,包含新增的4 // 结果:2, 3, 4
14. Any(存在满足条件的元素)
var numbers = new List<int> { 1, 2, 3 }; bool hasEven = numbers.Any(n => n % 2 == 0); // true(存在偶数2) bool isEmpty = numbers.Any(); // false(序列非空)
15. All(所有元素满足条件)
var numbers = new List<int> { 2, 4, 6 }; bool allEven = numbers.All(n => n % 2 == 0); // true(全是偶数)
16. Contains(包含指定元素)
var fruits = new List<string> { "苹果", "香蕉" }; bool hasBanana = fruits.Contains("香蕉"); // true
17. Append & Prepend(添加元素到末尾 / 开头)
18. Count(元素数量)
var numbers = new List<int> { 1, 2, 3, 4, 5 }; int total = numbers.Count(); // 5 int evenCount = numbers.Count(n => n % 2 == 0); // 2(偶数有2、4)
19. TryGetNonEnumeratedCount(非枚举获取计数)
var list = new List<int> { 1, 2, 3 }; if (list.TryGetNonEnumeratedCount(out int count)) { Console.WriteLine(count); // 3(无需枚举) }
20. Max(最大值)
var numbers = new List<int> { 3, 1, 4, 2 }; int max = numbers.Max(); // 4
21. MaxBy(按键取最大值元素)
var people = new List<Person> { new Person { Name = "Alice", Age = 25 }, new Person { Name = "Bob", Age = 30 } }; // 取年龄最大的人 Person oldest = people.MaxBy(p => p.Age); // Bob(30岁)
22. Min & MinBy(最小值 / 按键取最小值元素)
var numbers = new List<int> { 3, 1, 4, 2 }; int min = numbers.Min(); // 1 var people = new List<Person> { /* 同上 */ }; Person youngest = people.MinBy(p => p.Age); // Alice(25岁)
23. Sum(总和)
var numbers = new List<int> { 1, 2, 3 }; int sum = numbers.Sum(); // 6
24. Average(平均值)
var numbers = new List<int> { 1, 2, 3, 4 }; double avg = numbers.Average(); // 2.5
25. LongCount(长整数计数)
var largeList = Enumerable.Range(1, 1_000_000_000); long count = largeList.LongCount(); // 1000000000(超过int.MaxValue时使用)
26. Aggregate(聚合操作)
27. First & FirstOrDefault(第一个元素)
var numbers = new List<int> { 2, 4, 6 }; int firstEven = numbers.First(n => n % 2 == 0); // 2 int firstOdd = numbers.FirstOrDefault(n => n % 2 != 0); // 0(无奇数,返回默认值)
28. Single & SingleOrDefault(唯一元素)
var numbers = new List<int> { 1, 2, 3 }; int singleEven = numbers.Single(n => n == 2); // 2(唯一匹配) int singleOdd = numbers.SingleOrDefault(n => n == 4); // 0(无匹配)
29. Last & LastOrDefault(最后一个元素)
var numbers = new List<int> { 1, 2, 3 }; int last = numbers.Last(); // 3 int lastEven = numbers.LastOrDefault(n => n % 2 == 0); // 2
30. ElementAt & ElementAtOrDefault(按索引取元素)
var numbers = new List<int> { 1, 2, 3 }; int second = numbers.ElementAt(1); // 2(索引从0开始) int fifth = numbers.ElementAtOrDefault(4); // 0(索引越界)
31. DefaultIfEmpty(空序列时返回默认值)
var emptyList = new List<int>(); var result = emptyList.DefaultIfEmpty(0); // 结果:0(原序列为空,返回默认值0)
32. ToArray(转换为数组)
var numbers = new List<int> { 1, 2, 3 }; int[] array = numbers.ToArray(); // 类型:int[],值:[1,2,3]
33. ToList(转换为列表)
var numbers = new int[] { 1, 2, 3 }; List<int> list = numbers.ToList(); // 类型:List<int>,值:{1,2,3}
34. ToDictionary(转换为字典)
var people = new List<Person> { new Person { Id = 1, Name = "Alice" }, new Person { Id = 2, Name = "Bob" } }; // 以Id为键,Name为值 var dict = people.ToDictionary(p => p.Id, p => p.Name); // 结果:{1: "Alice", 2: "Bob"}
35. ToHashSet(转换为哈希集)
var numbers = new List<int> { 1, 2, 2, 3 }; HashSet<int> set = numbers.ToHashSet(); // 结果:{1, 2, 3}(去重)
36. ToLookup(创建 Lookup 集合)
var people = new List<Person> { new Person { Name = "Alice", Age = 25 }, new Person { Name = "Bob", Age = 25 }, new Person { Name = "Charlie", Age = 30 } }; // 按年龄分组(键:年龄,值:该年龄的人) ILookup<int, Person> lookup = people.ToLookup(p => p.Age); // 访问25岁的人:lookup[25] → Alice, Bob
37. ToEnumerable & ToQueryable(转换为 IEnumerable/Queryable)
38. Enumerable.Range(生成整数范围)
// 从1开始,生成5个整数 var range = Enumerable.Range(1, 5); // 结果:1, 2, 3, 4, 5
39. Enumerable.Repeat(生成重复元素)
// 重复"Hi" 3次 var repeated = Enumerable.Repeat("Hi", 3); // 结果:"Hi", "Hi", "Hi"
40. Enumerable.Empty(空序列)
IEnumerable<int> empty = Enumerable.Empty<int>(); // 空序列
41. Distinct(去重)
var numbers = new List<int> { 1, 2, 2, 3, 3, 3 }; var unique = numbers.Distinct(); // 结果:1, 2, 3
42. DistinctBy(按键去重)
var people = new List<Person> { new Person { Name = "Alice", Age = 25 }, new Person { Name = "Bob", Age = 25 }, // 与Alice年龄相同 new Person { Name = "Charlie", Age = 30 } }; // 按年龄去重(保留第一个25岁的Alice) var uniqueAges = people.DistinctBy(p => p.Age); // 结果:Alice(25)、Charlie(30)
43. 集合操作理论(Union/Intersect/Except)
44. Union(并集)
45. Intersect(交集)
46. Except(差集)
47. UnionBy & IntersectBy & ExceptBy(按键的集合操作)
var people1 = new List<Person> { new() { Id = 1 }, new() { Id = 2 } }; var people2 = new List<Person> { new() { Id = 2 }, new() { Id = 3 } }; // 按Id取并集 var unionBy = people1.UnionBy(people2, p => p.Id); // Id=1, 2, 3
48. SequenceEqual(序列是否相等)
var list1 = new List<int> { 1, 2, 3 }; var list2 = new List<int> { 1, 2, 3 }; var list3 = new List<int> { 1, 3, 2 }; bool equal1 = list1.SequenceEqual(list2); // true bool equal2 = list1.SequenceEqual(list3); // false(顺序不同)
49. Zip(合并两个序列)
var numbers = new List<int> { 1, 2, 3 }; var words = new List<string> { "One", "Two", "Three" }; var zipped = numbers.Zip(words, (n, w) => $"{n}: {w}"); // 结果:"1: One", "2: Two", "3: Three"
50. Join(连接两个序列)
var students = new List<Student> { new() { Id = 1, Name = "Alice" } }; var scores = new List<Score> { new() { StudentId = 1, Value = 90 } }; // 按StudentId连接学生和分数 var joined = students.Join( scores, s => s.Id, // 学生的键 sc => sc.StudentId, // 分数的键 (s, sc) => new { s.Name, sc.Value } // 结果投影 ); // 结果:{ Name = "Alice", Value = 90 }
51. GroupJoin(分组连接)
var courses = new List<Course> { new() { Id = 1, Name = "Math" } }; var students = new List<Student> { new() { Id = 1, Name = "Alice", CourseId = 1 }, new() { Id = 2, Name = "Bob", CourseId = 1 } }; // 按CourseId分组连接课程和学生 var groupJoined = courses.GroupJoin( students, c => c.Id, // 课程的键 s => s.CourseId, // 学生的键 (c, studentsInCourse) => new { CourseName = c.Name, Students = studentsInCourse.Select(s => s.Name) } ); // 结果:{ CourseName = "Math", Students = ["Alice", "Bob"] }
52. Concat(连接序列)
var list1 = new List<int> { 1, 2 }; var list2 = new List<int> { 2, 3 }; var concat = list1.Concat(list2); // 结果:1, 2, 2, 3(保留重复)
53. GroupBy(分组)
var people = new List<Person> { new() { Name = "Alice", Age = 25 }, new() { Name = "Bob", Age = 25 }, new() { Name = "Charlie", Age = 30 } }; // 按年龄分组 var groups = people.GroupBy(p => p.Age); // 结果: // 键25:Alice, Bob // 键30:Charlie
54. OrderBy(升序排序)
var people = new List<Person> { new() { Name = "Bob", Age = 30 }, new() { Name = "Alice", Age = 25 } }; // 按年龄升序 var ordered = people.OrderBy(p => p.Age); // 结果:Alice(25)、Bob(30)
55. OrderByDescending(降序排序)
// 按年龄降序 var orderedDesc = people.OrderByDescending(p => p.Age); // 结果:Bob(30)、Alice(25)
56. ThenBy & ThenByDescending(二次排序)
var people = new List<Person> { new() { Name = "Bob", Age = 25 }, new() { Name = "Alice", Age = 25 }, // 与Bob年龄相同 new() { Name = "Charlie", Age = 30 } }; // 先按年龄升序,再按姓名升序 var ordered = people.OrderBy(p => p.Age).ThenBy(p => p.Name); // 结果:Alice(25)、Bob(25)、Charlie(30)
57. Reverse(反转序列)
var numbers = new List<int> { 1, 2, 3 }; var reversed = numbers.Reverse(); // 结果:3, 2, 1
58. PLINQ(并行 LINQ)
var numbers = Enumerable.Range(1, 1_000_000); // 并行计算偶数的平方和(自动利用多线程) var sum = numbers.AsParallel() .Where(n => n % 2 == 0) .Select(n => n * n) .Sum();
以上涵盖了 LINQ 中最常用的方法,每个方法都有其特定场景,实际使用中常结合链式操作(如Where
+Select
+OrderBy
)处理复杂需求。