我正在尝试将集合分成相等数量的批次。下面是代码。
public static List<List<T>> SplitIntoBatches<T>(List<T> collection, int size)
{
var chunks = new List<List<T>>();
var count = 0;
var temp = new List<T>();
foreach (var element in collection)
{
if (count++ == size)
{
chunks.Add(temp);
temp = new List<T>();
count = 1;
}
temp.Add(element);
}
chunks.Add(temp);
return chunks;
}
我们可以使用Parallel.ForEach()
来获得更好的性能吗,因为列表中有大约100万个项目?
谢谢!
答案 0 :(得分:3)
如果要关注性能,我的想法(以影响的顺序递增):
temp = new List<T>(thisChunkSize)
new T[thisChunkSize]
(或内部使用的BlockCopy
,而不是一个个地复制单个元素CopyTo
会有所帮助;如果您愿意使用新的.NET功能,则非常适合ArraySegment<T>
/ Memory<T>
-在现有阵列上创建内存/跨度范围基本上是免费且即时的-即,使用{{ 1}},然后返回Span<T>
或类似值。即使您无法切换到T[]
/ List<Memory<T>>
等,也会返回仍可以使用的类似 的内容-即ArraySegment<T>
其中{{1 }}类似于:
Memory<T>
并通过适当处理List<ListSegment<T>>
和ListSegment<T>
使代码与readonly struct ListSegment<T> { // like ArraySegment<T>, but for List<T>
public List<T> List {get;}
public int Offset {get;}
public int Count {get;}
}
一起使用。