初始分组后,您可以按索引(在组中)除以2进行进一步分组,然后使用SelectMany
将其退出。
var result = startDate.GroupBy(x => x.StartDate)
.SelectMany(grp => grp.Select((x,i) => new{x,i})
.GroupBy(a => a.i/2)
.Select(sgrp => sgrp.Select(a => a.x)));
下面是关于正在发生的事情的细节。注意大括号将表示集合,正方形将表示具有多个属性的对象。
初始数据
09.00,13.00,13.00,13.00,15.00
后GroupBy(x => x.StartDate)
[关键:09.00,{09.00}],[键:13.00, {13.00,13.00,13.00}],[Key:15.00,{15.00}]
现在它将在每个组上进行操作,但是我会在每个步骤中显示所有组的结果。 后Select((x,i) => new{x,i})
{[X:09.00,I:0]},{[X:13.00,I:0],[X:13.00,I:1],[X:13.00,I: 2]},{[X:15.00,I:0]}
后GroupBy(a => a.i/2)
{[关键:0,{[X:09.00,I:0]}]}, {[Key:0,{[x:13.00,i:0],[x:13.00,i:1]}],[Key:1,{[x:13.00,i:2]}},{[Key :0,{[x:15.00,i:0]}}
的.Select(sgrp => sgrp.Select(a => a.x))
{{09.00}},{{13.00,13.00},{} 13.00},{{15之后。00}}
最后,SelectMany
将平坦的。
{09.00},{13.00,13.00},{13.00},{} 15.00
注意,每一行代表一个集合,但我并没有把他们周围的花括号,因为我觉得它使得阅读变得更加困难。
或与扩展方法
public static IEnumerable<IEnumerable<T>> Bin<T>(this IEnumerable<T> items, int binSize)
{
return items.Select((x,i) => new{x,i})
.GroupBy(a => a.i/binSize)
.Select(grp => grp.Select(a => a.x));
}
你可以把它更好一点。
var result = startDate.GroupBy(x => x.StartDate)
.SelectMany(grp => grp.Bin(2));
upvoted,因为它只是工作!但这正在融化我的思想o.o –
感谢您的一步一步的解释。你是个天才! –
非常感谢您的详细解释和查询。 :) – Rassix