【问题标题】:How to split a list of integers to smaller chunks? [duplicate]如何将整数列表拆分为更小的块? [复制]
【发布时间】:2014-01-29 08:34:18
【问题描述】:

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

【问题讨论】:

    标签: c# .net list


    【解决方案1】:

    我建议你使用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) 将从头开始为您添加到结果的每个批次枚举源列表。

    【讨论】:

    • @CodeCaster 让它留在这里 :) 我还解释了为什么当前的实现不是很好。顺便说一句,最好将此问题移至codereview.stackexchange.com,因为 OP 已经实现
    • 我喜欢你的解决方案,谢谢。
    【解决方案2】:

    试试这个,

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-20
      • 2023-01-07
      • 1970-01-01
      • 2021-02-02
      • 2023-02-11
      • 1970-01-01
      • 2012-11-04
      • 2017-05-07
      相关资源
      最近更新 更多