【问题标题】:LINQ Numerical Grouping [duplicate]LINQ数值分组[重复]
【发布时间】:2011-02-27 23:26:54
【问题描述】:

寻找一种使用 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);

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

【问题讨论】:

  • 如果有更好的方法那就太好了,但我认为没有。
  • 我的意思是,我总是可以将上面的代码写成一个扩展函数,我只是不知道延迟执行会如何处理这样的事情。我希望事情尽可能 LINQ'y :)

标签: c# .net linq


【解决方案1】:
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);

【讨论】:

  • !!!索引,我忘记了.Select 可以退货!谢谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-01
    • 2018-08-24
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多