📜  LINQ GroupBy运算符(1)

📅  最后修改于: 2023-12-03 15:17:19.695000             🧑  作者: Mango

LINQ GroupBy运算符

简介

GroupBy是LINQ中的一个运算符,它允许根据指定的键对集合进行分组。分组后的集合会以组为单位进行操作和查询。GroupBy运算符返回一个IGrouping<TKey, TElement>类型的集合,其中TKey表示键的类型,TElement表示分组中元素的类型。

使用方式
语法

使用GroupBy运算符的基本语法如下:

IEnumerable<IGrouping<TKey, TElement>> result = collection.GroupBy(keySelector);

其中,collection是要分组的集合,keySelector是一个用于选择键的委托,它定义了针对集合中的每个元素如何提取键的逻辑。

示例

假设有一个名为people的集合,其中包含了一组人员信息,我们可以根据他们的国家进行分组:

public class Person
{
    public string Name { get; set; }
    public string Country { get; set; }
}

List<Person> people = new List<Person>()
{
    new Person() { Name = "Alice", Country = "USA" },
    new Person() { Name = "Bob", Country = "UK" },
    new Person() { Name = "Charlie", Country = "USA" },
    new Person() { Name = "David", Country = "UK" },
    new Person() { Name = "Eve", Country = "USA" }
};

var result = people.GroupBy(p => p.Country);
结果

result将会是一个IEnumerable<IGrouping<string, Person>>类型的集合,其中每个IGrouping<string, Person>对象表示一个分组,其中string表示国家作为键的类型,Person则是分组中的元素类型。

遍历分组

可以使用foreach循环来遍历每个分组,以及分组中的元素:

foreach (var group in result)
{
    Console.WriteLine($"Country: {group.Key}");

    foreach (var person in group)
    {
        Console.WriteLine($"  - {person.Name}");
    }
}
运算符重载

GroupBy运算符还支持一些重载形式,可以传递一个可选的IEqualityComparer<TKey>参数来指定键的比较方式,以及一个可选的resultSelector委托来定义结果的投影。

IEnumerable<TResult> result = collection.GroupBy(keySelector, elementSelector);
总结

通过使用LINQ的GroupBy运算符,我们可以简单而高效地对集合进行分组操作。这为我们在处理复杂数据时提供了很大的便利性,同时也可以减少我们的代码量。