的GroupBy对内部列表属性

问题描述:

我有,我有嵌套表像下的GroupBy对内部列表属性

List = Stylist 
Inner List = Listerine 
Inner List Property = GroupByProperty 

现在我想所有Stylist项目,使我得到的结果中,我都记录分组名单通过GroupByProperty

,这样我可以得到所有的记录进行排序由GroupByProperty

我试着像下面

Sytlist.SelectMany(x => x.Listerine).GroupBy(c => c.GroupByProperty == 3).ToList(); 
+2

*我试过像下面的**但是** ...? – 2014-09-01 07:56:50

或..如果你只是想选择使用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本身不是可比类型,或者您需要自定义比较逻辑,则需要比较器。