初始分組後,您可以按索引(在組中)除以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