LINQ数值分组

时间:2010-06-04 20:06:24

标签: c# .net linq

寻找一种使用LINQ对n个元素集进行分组的方法。

即:

{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);

如果可能的话,我想避免这种令人讨厌的事情。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

我已经回答了类似的问题here。它仍然使用匿名类型,但我不认为它像你的例子那样“讨厌”。