Linq:如何按最大项目数进行分组

时间:2009-08-11 02:12:17

标签: c# linq grouping

CONTEXT

  • 我有一个项目列表(或任意长度)。我想把它们分成一定大小的“块”
  • 示例:我有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干净利落地优雅地表达“分块”。我不确定它是否有可能以一种简单的方式进行。
  • 我可以并且已经在普通的C#中实现了一个解决方案而不使用LINQ语法。因此,我的问题不是在这个问题上被阻止,而是我正在寻找方法在LINQ中表达它(再次干净和优雅)

4 个答案:

答案 0 :(得分:9)

您可以按(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;

答案 1 :(得分:2)

对于那些喜欢LINQ方法(使用lambda表达式)的人,这里有Dimitriy Matveev's answer转换:

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())

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

扩展方法(使用Jesse's answer):

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());
}