C# Linq的GroupBy()方法 – 根据指定的键对序列中的元素进行分组

  • Post category:C#

C# Linq是一种强大的编程语言,可以使用Linq查询语言进行分组操作。GroupBy()是Linq库中负责分组的方法,可以按照一个或多个条件把数据集合分成多个子集,同时返回一个IEnumerable集合,其中每个元素包含一个子集。下面是GroupBy()的完整攻略。

规范的方法签名

GroupBy()方法的标准签名如下:

public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector
)

其中, TSource 表示序列中元素的类型;TKey 表示分类关键字的数据类型;source 是一个可枚举的类型的集合;keySelector 是指定如何从序列的元素中获取分类关键字的查询函数。

GroupBy()方法返回的结果是以 IGrouping<TKey, TElement> 对象为元素的 IEnumerable 序列,其中,每个 IGrouping<TKey, TElement> 对象都表示一个子集,TKey 表示子集中元素的分类, TElement 表示子集中元素的类型。

用例示例

下面是两个简单的GroupBy()用例示例。

示例1:按照年龄分组

假设现在有一个包含员工信息的类,每个实例包含员工的姓名和年龄。现在需要按照员工的年龄分组,代码如下:

class Employee
{
    public string Name { get; set; }
    public int Age { get; set; }
}

// 初始化员工列表
List<Employee> employees = new List<Employee>
{
    new Employee { Name = "Lucas", Age = 24 },
    new Employee { Name = "Jack", Age = 22 },
    new Employee { Name = "Tom", Age = 24 },
    new Employee { Name = "Mike", Age = 22 },
    new Employee { Name = "John", Age = 23 }
};

// 按照年龄进行分组
var groups = employees.GroupBy(e => e.Age);

// 打印每个年龄分组的员工信息
foreach (var group in groups)
{
    Console.WriteLine("Age: {0}", group.Key);
    foreach (var employee in group)
    {
        Console.WriteLine("    {0}", employee.Name);
    }
}

输出结果如下:

Age: 24
    Lucas
    Tom
Age: 22
    Jack
    Mike
Age: 23
    John

示例2:按照首字母分组

假设现在有一个以字符串为元素的集合,需要按照每个字符串首字母分组。代码如下:

// 初始化字符串列表
List<string> strings = new List<string>
{
    "apple", "banana", "orange", "grape", "pear"
};

// 按照首字母进行分组
var groups = strings.GroupBy(s => s[0]);

// 打印每个首字母分组的字符串
foreach (var group in groups)
{
    Console.WriteLine("First letter: {0}", group.Key);
    foreach (var str in group)
    {
        Console.WriteLine("    {0}", str);
    }
}

输出结果如下:

First letter: a
    apple
First letter: b
    banana
First letter: o
    orange
First letter: g
    grape
First letter: p
    pear

总结

GroupBy()是一种非常有用的工具,可以让我们更方便地对数据集合进行分组。无论是对于Linq初学者还是有经验的开发人员,都可以从GroupBy()方法中学到很多有益的东西。