📅  最后修改于: 2023-12-03 15:32:39.508000             🧑  作者: Mango
GroupBy 是 LINQ 中非常有用的一个操作符,可以通过它对集合进行分组,并根据分组的特征对元素进行聚合等操作。
GroupBy 的基本使用形如下面的代码:
var groupedResults = from item in collection
group item by item.GroupingProperty into grouped
select new {
GroupingKey = grouped.Key,
GroupedItems = grouped
};
其中,collection
是要进行分组的集合,GroupingProperty
是用于分组的属性,group item by item.GroupingProperty
是指根据 GroupingProperty
所指定的属性值对集合进行分组,grouped
是分组后的结果,grouped.Key
返回的是分组的键,grouped
本身是一个集合,其中包含了属于该组的所有元素。
最后使用 select
对结果进行投影,将结果包装成一个新的对象,包含了分组的键和对应的集合。
在 GroupBy 中可以进行多级分组,形如下面的代码:
var groupedResults = from item in collection
group item by new {
item.GroupingProperty1,
item.GroupingProperty2
} into grouped
select new {
GroupingKey1 = grouped.Key.GroupingProperty1,
GroupingKey2 = grouped.Key.GroupingProperty2,
GroupedItems = grouped
};
其中,GroupingProperty1
和 GroupingProperty2
是用于分组的属性,使用 new
包装这两个属性可以将它们作为一个键来进行分组。
在 GroupBy 中可以进行分组后的聚合,形如下面的代码:
var groupedResults = from item in collection
group item by item.GroupingProperty into grouped
select new {
GroupingKey = grouped.Key,
Count = grouped.Count(),
Sum = grouped.Sum(x => x.NumericProperty),
Average = grouped.Average(x => x.NumericProperty)
};
其中,Count
表示该组中元素的数量,Sum
表示该组中元素的某个数值属性的总和,Average
表示该组中元素的某个数值属性的平均值。
在使用 GroupBy 时需要注意以下几点:
GetHashCode()
和 Equals()
方法,以便在分组时能够正确地匹配元素。IEnumerable<IGrouping<TKey, TElement>>
类型的集合,其中 TKey
是分组键的类型,TElement
是集合元素的类型。