10

语境

  • 我有一个项目列表(或任意长度)。我想将它们分组为一定大小的“块”
  • 示例:我有 12 个客户 [0,1,2,3,4,5,6,7,8,9,10,11] 并希望将他们的最小块分组为 5,这将给出 [0,1,2,3 ,4] [5,6,7,8,9] [10,11]
  • 注意:实际上,我不是在与客户合作,也不是单调递增的整数。我选择它只是为了简化问题

我的问题

如何制定执行此分组的简单 LINQ 查询(使用查询语法)?

背景

  • 例如,我已经熟悉如何使用 LINQ 语法按值进行分组(按客户 ID 对销售额进行分组),但是我不知道如何使用 LINQ 干净/优雅地表达“分块”。我不确定这是否可能以直接的方式进行。
  • 在不使用 LINQ 语法的情况下,我可以并且已经用普通的 C# 实现了一个解决方案。因此,我的问题并没有在这个问题上被阻止,而是我正在寻找在 LINQ 中表达它的方法(再次干净优雅)
4

4 回答 4

11

您可以按 (index/chunkSize) 对它们进行分组。例子:

    var result =
        from i in array.Select((value, index) => new { Value = value, Index = index })
        group i.Value by i.Index / chunkSize into g
        select g;
于 2009-08-11T02:21:12.673 回答
4

对于那些更喜欢 LINQ 方法(使用 lambda 表达式)的人,这里是Dimitriy Matveev 的答案转换:

var result = array
    .Select((value, index) => new { Value = value, Index = index })
    .GroupBy(i => i.Index / chunkSize, v => v.Value);

value如果您只需要, 而不是 的数组IGrouping<T1, T2>,则附加以下内容:

.Select(x => x.ToArray())
于 2014-07-17T22:16:30.360 回答
1

扩展方法(使用杰西的回答):

public static IEnumerable<T[]> GroupToChunks<T>(this IEnumerable<T> items, int chunkSize)
{
    if (chunkSize <= 0)
    {
        throw new ArgumentException("Chunk size must be positive.", "chunkSize");
    }

    return
        items.Select((item, index) => new { item, index })
             .GroupBy(pair => pair.index / chunkSize, pair => pair.item)
             .Select(grp => grp.ToArray());
}
于 2016-10-26T11:02:42.760 回答
0

要进行实际分组,不应该是:

var result = array
.Select((value, index) => new { Value = value, Index = index})
.GroupBy(i => i.Index / chunk, v => v.Value);
于 2016-03-28T18:54:03.863 回答