2010-06-04 61 views
4

尋找一種將LINQ組合爲n元素的方法。LINQ數字分組

即:

{1,2,3,4,5,6,7,8,9}

  • 分組通過2:{{1,2},{3,4},{5,6},{7,8},{9}}
  • 分組通過3:{{1,2,3},{4,5,6},{7,8,9}}
  • 分組通過4:{{1,2,3,4},{5,6,7,8},{9}}
  • 等等...

我現在所能想到的做的唯一方法是使用匿名類型生成組索引,然後按該索引進行分組。如果可能,我正在尋找更清潔的解決方案。

例子:

int groupSize = n; 
int groupCount = 0; 
int groupNum = 0; 

IEnumerable<T> items; 
IEnumerable<IGrouping<int,T>> groups = items 
    .Select(i => new 
    { 
     Index = ((groupCount++) % groupSize == 0) ? groupNum++ : groupNum, 
     Item = i 
    }) 
    .GroupBy(c => c.Index, d => d.Item); 

我想避免的事情這個討厭如果可能的話。

+0

如果有更好的方法,這將是非常棒的,但我不認爲這是真的。 – 2010-06-04 20:07:55

+0

這稱爲分區。 – SLaks 2010-06-04 20:08:50

+0

我的意思是,我總是可以將上面的內容寫成擴展函數,我只是不知道延遲執行如何處理類似的事情。我更喜歡LINQ'y儘可能的東西:) – Aren 2010-06-04 20:10:07

回答

6
var values = new []{ 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

groups = values.Select((v, i) => new { index = i, value = v }) 
    .GroupBy(k => k.index/n, e => e.value); 
+0

!!!該索引,我忘了'.Select'可以返回它!謝謝! – Aren 2010-06-04 20:22:52

0

我已經回答了類似問題here。它仍然使用匿名類型,但我認爲它不像您的示例那樣「討厭」。