📜  linq 中的 groupby (1)

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

LINQ 中的 GroupBy

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
                     };

其中,GroupingProperty1GroupingProperty2 是用于分组的属性,使用 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 是集合元素的类型。
  • GroupBy 操作虽然可以进行嵌套,但要注意它的顺序。在进行多级分组时,应该优先进行最高级别的分组,再进行下一级别的分组。