📜  linq 中的 groupby - C# (1)

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

Linq 中的 GroupBy - C#

Linq (Language-Integrated Query) 是 C# 中的一种语言集成查询,它通过使用统一语法和语义来查询各种数据源,包括对象、集合、数据库和 XML 等。

GroupBy 是 Linq 中的一个操作符,它将一个序列按照指定的键分组,返回一个由序列中的元素组成的集合,每个集合表示一组键相同的元素。

下面是一个简单的示例,演示了如何将一个整数序列按照它们的余数分组:

int[] numbers = { 1, 2, 3, 4, 5, 6 };
var groups = numbers.GroupBy(n => n % 3);

foreach (var group in groups)
{
    Console.WriteLine($"Numbers with remainder {group.Key}:");
    foreach (var number in group)
    {
        Console.WriteLine(number);
    }
}

输出结果:

Numbers with remainder 1:
1
4
Numbers with remainder 2:
2
5
Numbers with remainder 0:
3
6

从输出结果可以看出,这个整数序列被分成了三组,分别是余数为 1、2 和 0 的元素组成的集合。每个集合通过 GroupBy 方法生成,由一个键和一个由元素组成的序列组成。

在上面的示例中,我们使用 lambda 表达式来提供一个分组键。在实际应用中,我们可能需要更为复杂的分组条件,可能需要使用一个方法或者一个委托来提供分组键。下面是一个使用自定义方法作为分组键的例子:

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

IEnumerable<Person> people = GetPeople();
var groups = people.GroupBy(p => GetAgeGroup(p.Age));

foreach (var group in groups)
{
    Console.WriteLine($"People in age group {group.Key}:");
    foreach (var person in group)
    {
        Console.WriteLine(person.Name);
    }
}

int GetAgeGroup(int age)
{
    if (age < 18)
    {
        return 0;
    }
    else if (age < 25)
    {
        return 1;
    }
    else if (age < 35)
    {
        return 2;
    }
    else
    {
        return 3;
    }
}

在这个例子中,我们定义了一个 Person 类,每个 Person 对象有一个 Name 和一个 Age 属性。我们从某个数据源获取了一组 Person 对象,并使用 GetAgeGroup 方法来将它们分成不同的年龄段。最后,我们使用分组结果生成输出。

除了上述示例中的分组键之外,GroupBy 方法还支持多个键、嵌套分组和指定分组结果的比较规则等高级用法,这些内容在此不再赘述,感兴趣的读者可以自行查阅相关资料。

最后,需要注意的是,Linq 中的 GroupBy 方法是延迟执行的,也就是说,在对 GroupBy 方法生成的结果进行操作之前,不会真正执行分组操作,这可以帮助优化查询性能。如果需要立即执行分组操作,可以使用 ToList 或 ToArray 等方法。