尝试将列表拆分为较小的列表时出错
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()
返回 IEnumerable
的 IEnumerable<T>
。您正试图将其转换为 List<T>
,这永远不会起作用。
你拿出一个东西列表,把它分解成更小的东西列表,然后尝试把所有这些更小的列表放回一个大列表中。
如果您确实打算将子列表合并回一个列表,您可以这样做:
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以上是关于尝试将列表拆分为较小的列表时出错的主要内容,如果未能解决你的问题,请参考以下文章