LINQ操作符 #
一、过滤操作符 #
1.1 Where #
csharp
var numbers = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var evens = numbers.Where(n => n % 2 == 0);
var positive = numbers.Where(n => n > 0);
var complex = numbers.Where(n => n > 3 && n < 8);
1.2 OfType #
csharp
object[] items = { 1, "Hello", 2.5, "World", 3 };
var strings = items.OfType<string>();
var ints = items.OfType<int>();
二、投影操作符 #
2.1 Select #
csharp
var numbers = new[] { 1, 2, 3, 4, 5 };
var squares = numbers.Select(n => n * n);
var strings = numbers.Select(n => $"数字{n}");
var indexed = numbers.Select((n, i) => new { Index = i, Value = n });
2.2 SelectMany #
csharp
var lists = new[] { new[] { 1, 2 }, new[] { 3, 4 }, new[] { 5, 6 } };
var flattened = lists.SelectMany(x => x);
var people = new[] { new { Name = "张三", Hobbies = new[] { "读书", "运动" } } };
var allHobbies = people.SelectMany(p => p.Hobbies);
三、排序操作符 #
3.1 OrderBy #
csharp
var numbers = new[] { 5, 2, 8, 1, 9, 3 };
var sorted = numbers.OrderBy(n => n);
var descending = numbers.OrderByDescending(n => n);
var people = new[] { new { Name = "张三", Age = 25 }, new { Name = "李四", Age = 20 } };
var byAge = people.OrderBy(p => p.Age);
3.2 ThenBy #
csharp
var people = new[]
{
new { Name = "张三", Age = 25, City = "北京" },
new { Name = "李四", Age = 25, City = "上海" },
new { Name = "王五", Age = 30, City = "北京" }
};
var sorted = people.OrderBy(p => p.Age).ThenBy(p => p.Name);
var desc = people.OrderByDescending(p => p.Age).ThenByDescending(p => p.Name);
3.3 Reverse #
csharp
var numbers = new[] { 1, 2, 3, 4, 5 };
var reversed = numbers.Reverse();
四、分组操作符 #
4.1 GroupBy #
csharp
var numbers = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var groups = numbers.GroupBy(n => n % 2);
foreach (var group in groups)
{
Console.WriteLine($"Key: {group.Key}");
foreach (var n in group)
{
Console.WriteLine($" {n}");
}
}
var people = new[] { new { Name = "张三", Age = 25 }, new { Name = "李四", Age = 25 }, new { Name = "王五", Age = 30 } };
var byAge = people.GroupBy(p => p.Age, p => p.Name);
var stats = people.GroupBy(p => p.Age, (age, ps) => new { Age = age, Count = ps.Count() });
4.2 ToLookup #
csharp
var people = new[] { new { Name = "张三", Age = 25 }, new { Name = "李四", Age = 25 } };
var lookup = people.ToLookup(p => p.Age);
var age25 = lookup[25];
五、连接操作符 #
5.1 Join #
csharp
var customers = new[] { new { Id = 1, Name = "张三" }, new { Id = 2, Name = "李四" } };
var orders = new[] { new { CustomerId = 1, Product = "笔记本" }, new { CustomerId = 1, Product = "鼠标" } };
var result = customers.Join(orders, c => c.Id, o => o.CustomerId, (c, o) => new { c.Name, o.Product });
5.2 GroupJoin #
csharp
var customers = new[] { new { Id = 1, Name = "张三" } };
var orders = new[] { new { CustomerId = 1, Product = "笔记本" }, new { CustomerId = 1, Product = "鼠标" } };
var result = customers.GroupJoin(orders, c => c.Id, o => o.CustomerId, (c, os) => new { c.Name, Orders = os });
5.3 Zip #
csharp
var names = new[] { "张三", "李四", "王五" };
var ages = new[] { 25, 30, 28 };
var combined = names.Zip(ages, (name, age) => new { Name = name, Age = age });
六、集合操作符 #
6.1 Distinct #
csharp
var numbers = new[] { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4 };
var distinct = numbers.Distinct();
var people = new[] { new { Name = "张三", Age = 25 }, new { Name = "张三", Age = 25 } };
var distinctPeople = people.DistinctBy(p => p.Name);
6.2 Union #
csharp
var set1 = new[] { 1, 2, 3 };
var set2 = new[] { 3, 4, 5 };
var union = set1.Union(set2);
6.3 Intersect #
csharp
var set1 = new[] { 1, 2, 3, 4 };
var set2 = new[] { 3, 4, 5, 6 };
var intersect = set1.Intersect(set2);
6.4 Except #
csharp
var set1 = new[] { 1, 2, 3, 4 };
var set2 = new[] { 3, 4, 5, 6 };
var except = set1.Except(set2);
七、转换操作符 #
7.1 ToArray和ToList #
csharp
var numbers = Enumerable.Range(1, 10);
int[] array = numbers.ToArray();
List<int> list = numbers.ToList();
7.2 ToDictionary #
csharp
var people = new[] { new { Id = 1, Name = "张三" }, new { Id = 2, Name = "李四" } };
var dict = people.ToDictionary(p => p.Id, p => p.Name);
7.3 AsEnumerable和AsQueryable #
csharp
var numbers = new[] { 1, 2, 3, 4, 5 };
var enumerable = numbers.AsEnumerable();
var queryable = numbers.AsQueryable();
八、总结 #
LINQ操作符要点:
| 类别 | 操作符 |
|---|---|
| 过滤 | Where, OfType |
| 投影 | Select, SelectMany |
| 排序 | OrderBy, ThenBy |
| 分组 | GroupBy, ToLookup |
| 连接 | Join, GroupJoin |
| 集合 | Distinct, Union, Intersect, Except |
下一步,让我们学习LINQ to Objects!
最后更新:2026-03-26