内部列表属性上的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();

内部列表属性上的GroupBy

或者。。如果您只想使用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语句是错误的。您将得到一个按truefalse值分组的列表,因为语句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)

其中comparerIComparer<T>的实现,而TGroupByProperty的类型。如果T本身不是可比较类型,或者您需要自定义比较逻辑,则需要比较器。