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