在 C# 中,我们经常会遇到需要处理大量数据的情况。有时候我们不希望一次性返回所有的数据,而是希望分批次返回数据,以减少内存的占用和提高效率。在这种情况下,C# 中的 IEnumerable
什么是 IEnumerable?
IEnumerable
如何实现分批次返回数据?
我们可以利用 IEnumerable
public class BatchData<T>
{
private IEnumerable<T> _sourceData;
public BatchData(IEnumerable<T> sourceData)
{
_sourceData = sourceData;
}
public IEnumerable<IEnumerable<T>> GetBatches(int batchSize)
{
var batch = new List<T>(batchSize);
foreach (var item in _sourceData)
{
batch.Add(item);
if (batch.Count == batchSize)
{
yield return batch;
batch.Clear();
}
}
if (batch.Count > 0)
{
yield return batch;
}
}
}
上述代码中的 BatchData<T>
类封装了原始数据源,并提供了一个 GetBatches
方法用于分批次返回数据。该方法接受一个整数参数 batchSize
,表示每批次返回的数据量。
在 GetBatches
方法中,我们通过一个迭代器方法(使用 yield return
关键字)来实现分批次返回数据的逻辑。我们首先创建一个临时的列表 batch
,并依次将数据添加到该列表中。当 batch
的数量达到 batchSize
时,我们使用 yield return
关键字将 batch
返回并清空。最后,在循环结束后,我们通过判断 batch
是否有剩余元素,将其返回。
如何使用分批次返回数据?
使用分批次返回数据非常简单,我们只需要创建一个 BatchData<T>
对象,并调用其 GetBatches
方法即可。下面是一个使用示例:
// 假设我们有一个包含 100 个整数的数据源
var sourceData = Enumerable.Range(1, 100);
var batchData = new BatchData<int>(sourceData);
// 指定每批次返回 10 个元素
var batches = batchData.GetBatches(10);
// 遍历并输出每个批次的数据
foreach (var batch in batches)
{
Console.WriteLine(string.Join(",", batch));
}
在上述示例中,我们通过 Enumerable.Range
方法创建了一个包含 1 到 100 的整数序列,并将其作为源数据传递给 BatchData
类的构造函数。然后,我们调用 GetBatches
方法来获取每批次返回的数据集合,并在循环中输出每个批次的数据。
总结
通过实现 IEnumerable
参考链接: