尝试将列表拆分为较小的列表时出错

Posted

技术标签:

【中文标题】尝试将列表拆分为较小的列表时出错【英文标题】:Error when trying to split list into smaller lists 【发布时间】:2021-10-10 22:49:44 【问题描述】:

错误:

无法从“System.Collections.Generic.List”转换为“System.Collections.Generic.List”

守则:

 for (int i = 0; i < Speed; i++)
 
    Tasks[i] = Task.Run(() =>
    
       var arr_ = arr.Chunk(Total / Speed).ToList(); 
       Program.Check(arr_, Key, Current, Total, Node, Token);
    , Token);
 

Chunk(int)方法:

    public static IEnumerable<IEnumerable<T>> Chunk<T>(this IEnumerable<T> list, int chunkSize)
    
        if (chunkSize <= 0)
        
            throw new ArgumentException("chunkSize must be greater than 0.");
        

        while (list.Any())
        
            yield return list.Take(chunkSize);
            list = list.Skip(chunkSize);
        
    

我已经被困在这里一段时间没有解决方案,你们谁能告诉我我做错了什么?这个想法是从一个更大的列表 (arr) 开始,然后在循环中将其转换为 Total / Speed 大小的较小列表,然后将其用于另一个函数。

我理解yield return 工作原理的方式是,每次调用它时,它都应该返回它所在的循环的下一次迭代,但我不太确定它到底是如何工作的,否则它看起来喜欢它应该在这里工作。

感谢任何帮助,谢谢

【问题讨论】:

你可能想看看 MoreLinq 的 Batch() 扩展方法。它完全符合您的要求,并且可以作为 NuGet 包使用 morelinq.github.io/2.1/ref/api/html/… @EricJ。谢谢,这看起来很有帮助,如果我找不到任何其他解决方案,我会使用它,但我最好不要在这个项目中使用 NuGet 包 【参考方案1】:

Chunk() 返回 IEnumerableIEnumerable&lt;T&gt;。您正试图将其转换为 List&lt;T&gt;,这永远不会起作用。

你拿出一个东西列表,把它分解成更小的东西列表,然后尝试把所有这些更小的列表放回一个大列表中。

如果您确实打算将子列表合并回一个列表,您可以这样做:

var _list = list.Chunk(3).SelectMany(i => i).ToList();

如果您根据其返回类型正确使用Chunk(),它就可以正常工作,例如

List<int> list = new List<int>()  1, 2, 3, 4, 5, 6 ;
foreach (var chunk in list.Chunk(3))
    Console.WriteLine(string.Join(", ", chunk));

输出

1, 2, 3
4, 5, 6

【讨论】:

非常感谢!我不明白如何使用 IEnumarble 的 IEnumerable 但这绝对清除了这一点。

以上是关于尝试将列表拆分为较小的列表时出错的主要内容,如果未能解决你的问题,请参考以下文章

将列表拆分为较小的列表(分成两半)

python – 将列表拆分为较小的列表

c#如何将2D数组拆分为较小的2D数组(块)列表?

将更改列表压缩为较小的列表

如何将大数组拆分为较小的数组?

我可以按元素属性将列表拆分为更小的列表吗