内部列表属性上的GroupBy
本文关键字:GroupBy 属性 列表 内部 | 更新日期: 2023-09-27 18:20:14
我有一个列表,其中有嵌套的列表,如以下
List = Stylist
Inner List = Listerine
Inner List Property = GroupByProperty
现在,我想对所有Stylist
项进行分组,这样我就可以得到结果,其中所有记录都按GroupByProperty
分组。
以便我可以获得按GroupByProperty
排序的所有记录
我试着关注
Sytlist.SelectMany(x => x.Listerine).GroupBy(c => c.GroupByProperty == 3).ToList();
或者。。如果您只想使用WHERE和ORDERBY 进行选择
Sytlist.SelectMany(x => x.Listerine).Where(c => c.GroupByProperty == 3).Orderby(c => c.GroupByProperty).ToList();
或者你可能只是想删除打字错误造型师iso Sytlist
Sytlist.SelectMany(x => x.Listerine).GroupBy(c => c.GroupByProperty == 3).ToList();
所以没有分组:
Stylist.SelectMany(x => x.Listerine).OrderBy(c => c.GroupByProperty).ToList();
也许您还想在SelectMany 中选择groupbyproperty
拥有.GroupBy(c => c.GroupByProperty == 3)
将产生2组。一个GroupByProperty等于3,另一个GroupByProperty不等于3。您只需要添加分组依据的属性。
Sytlist.SelectMany(x => x.Listerine).GroupBy(c => c.GroupByProperty).ToList();
如果c.GroupByProperty == 3
是一个过滤器,那么您应该使用Where
:
Sytlist.SelectMany(x => x.Listerine).Where(c => c.GroupByProperty == 3).GroupBy(c => c.GroupByProperty).ToList();
尽管在这种情况下,GroupBy条款中没有任何含义。
您的GroupBy
语句是错误的。您将得到一个按true
或false
值分组的列表,因为语句c => c.GroupByProperty == 3
的计算结果为布尔值。
相反,您可能需要使用:
var result = Sytlist.SelectMany(x => x.Listerine).GroupBy(c => c.GroupByProperty);
以上操作将返回IGrouping
对象的集合,而不是平面列表。您可以通过以类似的方式枚举每个组来访问它:
foreach (var group in result) {
var key = group.Key; // this is a single value of the `GroupByProperty` type.
foreach (var obj in group) {
// cycle trough all items which are grouped by the current `key` item
}
}
基本上,GroupBy
的结果就像一个映射,其中键是GroupByProperty
的任何单个值,该值是所有匹配项的集合。在没有匹配项的结果中,您将不会收到组。
如果您只需要一个按GroupByProperty
排序的平面列表,那么整个GroupBy
方法就无关紧要了。您可以简单地使用:
Sytlist.SelectMany(x => x.Listerine).OrderBy(c => GroupByProperty)
或
Sytlist.SelectMany(x => x.Listerine).OrderBy(c => GroupByProperty, comparer)
其中comparer
是IComparer<T>
的实现,而T
是GroupByProperty
的类型。如果T
本身不是可比较类型,或者您需要自定义比较逻辑,则需要比较器。