📅  最后修改于: 2023-12-03 15:02:41.482000             🧑  作者: Mango
在使用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
是内部序列,outerKeySelector
和innerKeySelector
是分别从外部和内部序列中提取键值的函数,而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中常用的分组运算符,包括GroupBy
、ToLookup
和GroupJoin
。这些分组运算符可以帮助我们对查询结果进行分类整理,提高查询结果的可读性和可用性。