📜  LINQ |分组运算符|去查查看(1)

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

LINQ 分组运算符

在使用LINQ查询数据时,有时需要对结果进行分组,这时候可以使用LINQ分组运算符。本文介绍常用的LINQ分组运算符及其用法。

GroupBy方法

GroupBy方法是最常用的分组运算符,用于按指定的条件对元素序列进行分组。其语法如下:

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

其中,source是要进行分组的元素序列,而keySelector是按照某个条件从元素序列中提取键值的函数。

例如,有一个包含多个人员信息的序列:

IEnumerable<Person> persons = // ...

我们可以按照人员所在的部门对其进行分组,代码如下:

IEnumerable<IGrouping<string, Person>> groups = 
    persons.GroupBy(p => p.Department);

这样就可以将人员按照部门分组,其中IGrouping<string, Person>表示一个键值为string类型,值为Person类型的分组。

然后可以使用foreach循环对分组结果进行遍历:

foreach (var group in groups)
{
    Console.WriteLine(group.Key);
    foreach (var person in group)
    {
        Console.WriteLine(person.Name);
    }
}

其中,group.Key表示当前分组的键值,而group本身是一个IEnumerable<Person>类型的序列。

ToLookup方法

ToLookup方法与GroupBy方法类似,也是用于对序列进行分组,其语法如下:

ILookup<TKey, TSource> ToLookup<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);

其中,source是要进行分组的元素序列,而keySelector是按照某个条件从元素序列中提取键值的函数。

GroupBy不同的是,ToLookup方法返回的是一个ILookup<TKey, TSource>类型的序列,其可以像字典一样使用:

ILookup<string, Person> lookup = persons.ToLookup(p => p.Department);
IEnumerable<Person> group = lookup["IT"];

其中,lookup["IT"]表示获取部门为IT的人员列表。

GroupJoin方法

GroupJoin方法用于按照某个条件从两个序列中找到匹配的元素,并将它们以分组的形式返回。其语法如下:

IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, IEnumerable<TInner>, TResult> resultSelector);

其中,outer是外部序列,inner是内部序列,outerKeySelectorinnerKeySelector是分别从外部和内部序列中提取键值的函数,而resultSelector是用于返回分组结果的函数。

例如,有两个序列分别代表部门信息和人员信息:

IEnumerable<Department> departments = // ...
IEnumerable<Person> persons = // ...

我们可以按照部门信息和人员信息中的部门名称进行匹配,并将人员列表以分组的形式返回:

IEnumerable<JoinResult> results = 
    departments.GroupJoin(persons, d => d.Name, p => p.Department, (d, g) => new JoinResult { Department = d, Persons = g });

其中,JoinResult是一个自定义类型,用于存储分组结果:

class JoinResult
{
    public Department Department { get; set; }
    public IEnumerable<Person> Persons { get; set; }
}

分组结果可以使用foreach循环进行遍历:

foreach (var result in results)
{
    Console.WriteLine(result.Department.Name);
    foreach (var person in result.Persons)
    {
        Console.WriteLine(person.Name);
    }
}
总结

本文介绍了LINQ中常用的分组运算符,包括GroupByToLookupGroupJoin。这些分组运算符可以帮助我们对查询结果进行分类整理,提高查询结果的可读性和可用性。