我有一个包含50个项目的整数列表:
List<int> list = CreateList();
我怎么能把它分成9个项目?
List<List<int>> chunks = CreateChucks(list);
我写过这个,有没有更好的方法?
private static List<List<T>> GetChunks<T>(List<T> list, int maxChunkSize = 1000)
{
var chunks = new List<List<T>>();
for (int i = 0; i < list.Count; i = i + maxChunkSize)
{
chunks.Add(list.Skip(i).Take(maxChunkSize).ToList());
}
return chunks;
}
答案 0 :(得分:3)
我建议您使用MoreLINQ的Batch
运算符(可从NuGet获取):
IEnumerable<IEnumerable<int>> chuncks = list.Batch(9);
如果您需要列表列表,则可以创建自己的扩展名:
public static List<List<T>> Batch(this IEnumerable<T> source, int batchSize)
{
List<List<T>> result = new List<List<T>>();
List<T> batch = new List<T>(batchSize);
foreach(T item in source)
{
if (batch.Count == batchSize)
{
result.Add(batch);
batch = new List<T>(batchSize);
}
batch.Add(item);
}
if (batch.Any())
result.Add(batch);
return result;
}
您当前的实施有很大的缺点 - list.Skip(i)
将从您添加到结果的每个批次开始枚举源列表。
答案 1 :(得分:0)
试试这个,
var list = new List<int>();
for (var i = 0; i < 50; i++)
list.Add(i);
var chunk = new List<List<int>>();
var chunkSize = list.Count / 9;
for (var i = 0; i < 9; i++)
{
var p = list.Skip(i * chunkSize).Take(chunkSize).ToList();
chunk.Add(p);
}