的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();
或..如果你只是想选择使用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
本身不是可比类型,或者您需要自定义比较逻辑,则需要比较器。
*我试过像下面的**但是** ...? – 2014-09-01 07:56:50