LINQ:如何通过组项目的最大数量(Linq: How to group by maximum nu

2019-09-22 23:47发布

CONTEXT

  • 我有一个项目列表(或任意长度)。 我想他们组中具有一定规模的“块”
  • 例如:我有12个客户[0,1,2,3,4,5,6,7,8,9,10,11]和想要的5组themin块这将得到[0,1,2,3 ,4] [5,6,7,8,9] [10,11]
  • 注:在现实中我没有与客户或单调递增的整数。 我拿起那只是为了简化问的问题

我的问题

我怎样才能制定一个简单的LINQ查询(使用查询语法)执行此分组?

背景

  • 我已经熟悉了如何通过一个值,例如(由客户ID组销售)使用LINQ语法进行分组,但是我不知如何表达“分块”干净/优雅的使用LINQ。 我不知道,如果它以简单的方式甚至有可能。
  • 我可以和已经实施以纯老C#的解决方案,而无需使用LINQ语法。 因此,我的问题是不是被封锁在这个问题上,而是我正在寻找的方式来表达它的LINQ(又干净,优雅)

Answer 1:

你可以将它们按(索引/ 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;


Answer 2:

对于那些谁喜欢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())


Answer 3:

要做到实际分组,应该不会是:

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


Answer 4:

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

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


文章来源: Linq: How to group by maximum number of items
标签: c# linq grouping