一起使用时. 我用 IEnumerable<> 返回我所有的数据列表我使用“yield return”来防止我必须分配-6ren">
gpt4 book ai didi

c# - LINQ/IEnumerable Skip().Take() 效率与 "yield return"一起使用

转载 作者:太空狗 更新时间:2023-10-30 00:52:20 25 4
gpt4 key购买 nike

我对 Skip() 的效率有疑问和 Take()当与 IEnumerable<> 一起使用时.

我用 IEnumerable<> 返回我所有的数据列表我使用“yield return”来防止我必须分配大量内存来传回数据。这非常有效。

但是,在我的流程后期,我想对这些数据进行批处理,并一次从我的列表中提取 20 个条目的 block 。我心想.. 啊!这非常适合枚举器。

我发现了非常有用的 Skip()Take() IEnumerable interface 上的方法但是我现在意识到这会导致我的循环每次都从头开始重新交互。

IEnumerable 中分页数据的最佳方式是什么? ?我最好还是使用 MoveFirst()MoveNext()在枚举器上而不是 Skip()Take()

我已经做了一些谷歌搜索,但找不到答案..

有人可以帮忙吗?

我真的很喜欢LINQ IEnumerable<> 上的功能但是我真的必须考虑效率。

最佳答案

您可以编写一个 Batch 方法将一个项目序列转换为一个给定大小的批处理序列,无需多次迭代源序列即可完成,并且可以限制一次只在内存中保存一批大小的内存占用:

public static IEnumerable<IEnumerable<T>> Batch<T>(
this IEnumerable<T> source, int batchSize)
{
List<T> buffer = new List<T>(batchSize);

foreach (T item in source)
{
buffer.Add(item);

if (buffer.Count >= batchSize)
{
yield return buffer;
buffer = new List<T>(batchSize);
}
}
if (buffer.Count > 0)
{
yield return buffer;
}
}

关于c# - LINQ/IEnumerable Skip().Take() 效率与 "yield return"一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21882242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com