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(又干净,优雅)
你可以将它们按(索引/ 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;
对于那些谁喜欢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())
要做到实际分组,应该不会是:
var result = array
.Select((value, index) => new { Value = value, Index = index})
.GroupBy(i => i.Index / chunk, v => v.Value);
扩展方法 (使用杰西的答案 ):
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());
}