我如何组织一个可枚举的?

我需要一个优雅的方法,它接受一个可枚举的,并获得可枚举的枚举,每个元素中包含相同数量的元素,但最后一个:

public static IEnumerable<IEnumerable> Chunk(this IEnumerable values, Int32 chunkSize) { // TODO: code that chunks } 

这是我尝试过的:

  public static IEnumerable<IEnumerable> Chunk(this IEnumerable values, Int32 chunkSize) { var count = values.Count(); var numberOfFullChunks = count / chunkSize; var lastChunkSize = count % chunkSize; for (var chunkIndex = 0; chunkSize  0) { yield return values.Skip(chunkSize * count).Take(lastChunkSize); } } 

更新刚发现有一个关于将列表拆分列表拆分为LINQ的子列表的类似主题

如果不考虑内存消耗,那么这样吗?

 static class Ex { public static IEnumerable> Chunk( this IEnumerable values, Int32 chunkSize) { return values .Select((v, i) => new {v, groupIndex = i / chunkSize}) .GroupBy(x => x.groupIndex) .Select(g => g.Select(x => xv)); } } 

否则,您可以使用yield关键字获得创意,如下所示:

 static class Ex { public static IEnumerable> Chunk( this IEnumerable values, Int32 chunkSize) { using(var enumerator = values.GetEnumerator()) { while(enumerator.MoveNext()) { yield return GetChunk(enumerator, chunkSize).ToList(); } } } private static IEnumerable GetChunk( IEnumerator enumerator, int chunkSize) { do{ yield return enumerator.Current; }while(--chunkSize > 0 && enumerator.MoveNext()); } } 
 public static IEnumerable> Chunk(this IEnumerable source, int chunksize) { while (source.Any()) { yield return source.Take(chunksize); source = source.Skip(chunksize); } } 

只有一些快速测试,但这似乎工作:

 public static IEnumerable> Chunk(this IEnumerable values, Int32 chunkSize) { var valuesList = values.ToList(); var count = valuesList.Count(); for (var i = 0; i < (count / chunkSize) + (count % chunkSize == 0 ? 0 : 1); i++) { yield return valuesList.Skip(i * chunkSize).Take(chunkSize); } }