在大型数据集上执行LINQ表达式时报告进度,可以通过以下几个步骤实现:
以下是一个使用C#实现的示例代码:
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main(string[] args)
{
List<int> data = Enumerable.Range(1, 1000).ToList();
int blockSize = 100;
int totalBlocks = (int)Math.Ceiling(data.Count / (double)blockSize);
int processedBlocks = 0;
foreach (var block in data.Batch(blockSize))
{
processedBlocks++;
var result = block.Where(x => x % 2 == 0).ToList();
Console.WriteLine($"Processed block {processedBlocks}/{totalBlocks}, result count: {result.Count}");
}
Console.WriteLine("All blocks processed.");
}
}
static class EnumerableExtensions
{
public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> source, int size)
{
T[] bucket = null;
int count = 0;
foreach (var item in source)
{
if (bucket == null)
{
bucket = new T[size];
}
bucket[count++] = item;
if (count == size)
{
yield return bucket;
bucket = null;
count = 0;
}
}
if (bucket != null && count > 0)
{
Array.Resize(ref bucket, count);
yield return bucket;
}
}
}
在这个示例中,我们将大型数据集分成大小为100的小块,并使用LINQ表达式处理每个小块。在处理每个小块后,我们输出进度信息,包括已处理的小块数和结果的计数。最后,我们输出所有小块已处理的信息。
这种方法可以帮助您在处理大型数据集时报告进度,同时还可以通过调整块大小来平衡内存使用和性能。
领取专属 10元无门槛券
手把手带您无忧上云