Linq每次根据我们的枚举器选择5项
我们的列表,例如"theList"
有 100件,
想要查看列表并在每次迭代中选择5个项目,
示例代码,我们希望将其更改为我们想要的结果:
theList = dt.AsEnumerable()
.Select(row => new CustItem
{
Name = row.Field<string>("tName"),
Title = row.Field<string>("tTitle"),
}).ToList();
我们应该在一个循环中迭代它并且每次处理所选择的5个项目,或者将它传递给我们的其他方法:
类似的东西:
for (int i=0; i < 20 ; i++)
我想在"i"
语句中使用linq select
枚举器,并使多重性能够构成新结果集的边界。
答案 0 :(得分:40)
foreach (var batch in query.Batch(5))
{
foreach (var item in batch)
{
...
}
}
答案 1 :(得分:37)
for (int i=0; i < 20 ; i++)
{
var fiveitems = theList.Skip(i*5).Take(5);
}
答案 2 :(得分:28)
您也可以使用整数算法和GroupBy
方法,使用纯linq执行此操作:
int blockSize = 5;
var group = theList.Select((x, index) => new { x, index })
.GroupBy(x => x.index / blockSize, y => y.x);
foreach (var block in group)
{
// "block" will be an instance of IEnumerable<T>
...
}
这种方法有许多优点,但不一定非常明显:
答案 3 :(得分:4)
试试这个:
for (int i = 0; i < list.Count; i = i + 5) {
var fiveitems = list.Skip(i).Take(5);
foreach(var item in fiveitems)
{
}
}
答案 4 :(得分:0)
以下静态扩展方法可以将列表拆分为特定批量大小的多个列表。
public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> items, int noOfItemsPerBatch)
{
decimal iterations = items.Count() / noOfItemsPerBatch;
var roundedIterations = (int)Math.Ceiling(iterations);
var batches = new List<IEnumerable<T>>();
for (int i = 0; i < roundedIterations; i++)
{
var newBatch = items.Skip(i * noOfItemsPerBatch).Take(noOfItemsPerBatch).ToArray();
batches.Add(newBatch);
}
return batches;
}
使用示例
var items = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var batchedItems = items.Batch(4);
Assert.AreEqual(batchedItems.Count() == 3);
Assert.AreEqual(batchedItems[0].Count() == 4);
Assert.AreEqual(batchedItems[1].Count() == 4);
Assert.AreEqual(batchedItems[2].Count() == 2);