我正在开发一个具有"IEnumerable users“的用户程序,其中存储了4,000,000个用户的ids。我需要遍历Ienummerable并每次提取一个批次1000ID,以便在另一个方法中执行一些操作。
如何从可枚举...do的开头一次提取1000个ids,然后获取下一批1000个ids,依此类推?
这个是可能的吗?
发布于 2013-03-15 00:10:38
听起来你需要使用对象的Skip和Take方法。示例:
users.Skip(1000).Take(1000)
这将跳过前1000个,然后取下一个1000。您只需增加每次调用跳过的数量
您可以将整数变量与Skip的参数一起使用,并且可以调整跳过的量。然后,您可以在方法中调用它。
public IEnumerable<user> GetBatch(int pageNumber)
{
return users.Skip(pageNumber * 1000).Take(1000);
}
发布于 2013-03-15 00:08:17
最简单的方法可能就是在LINQ中使用GroupBy
方法:
var batches = myEnumerable
.Select((x, i) => new { x, i })
.GroupBy(p => (p.i / 1000), (p, i) => p.x);
但对于更复杂的解决方案,请参阅此blog post,了解如何创建自己的扩展方法来实现此目的。在这里复制给后人:
public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> collection, int batchSize)
{
List<T> nextbatch = new List<T>(batchSize);
foreach (T item in collection)
{
nextbatch.Add(item);
if (nextbatch.Count == batchSize)
{
yield return nextbatch;
nextbatch = new List<T>();
// or nextbatch.Clear(); but see Servy's comment below
}
}
if (nextbatch.Count > 0)
yield return nextbatch;
}
发布于 2013-03-15 00:11:45
尝试使用以下命令:
public static IEnumerable<IEnumerable<TSource>> Batch<TSource>(
this IEnumerable<TSource> source,
int batchSize)
{
var batch = new List<TSource>();
foreach (var item in source)
{
batch.Add(item);
if (batch.Count == batchSize)
{
yield return batch;
batch = new List<TSource>();
}
}
if (batch.Any()) yield return batch;
}
并使用上面的函数:
foreach (var list in Users.Batch(1000))
{
}
https://stackoverflow.com/questions/15414347
复制相似问题