如何将整数列表拆分为较小的块?

时间:2014-01-10 11:26:57

标签: c# .net list

我有一个包含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;
    }

2 个答案:

答案 0 :(得分:3)

我建议您使用MoreLINQBatch运算符(可从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);
}