2010-06-04 77 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。它仍然使用匿名类型,但我认为它不像您的示例那样“讨厌”。