35

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器并进行多重性来确定我们新结果集的边界。

4

5 回答 5

41
for (int i=0; i < 20 ; i++)
{
    var fiveitems = theList.Skip(i*5).Take(5);
}
于 2012-07-11T07:15:45.213 回答
40

听起来您想要Batch来自MoreLINQ的运算符:

foreach (var batch in query.Batch(5))
{
    foreach (var item in batch)
    {
        ...
    } 
}
于 2012-07-11T07:14:40.227 回答
31

您也可以通过利用整数算术和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>
    ...
}

这种方法有许多优点,但不一定立即显而易见:

  • 执行被延迟,因此在使用条件处理时它很有效
  • 您不需要知道集合的长度,从而避免了多次枚举,同时通常也比其他方法更干净
于 2012-07-12T02:18:14.067 回答
4

试试这个:

 for (int i = 0; i < list.Count; i = i + 5) {
                var fiveitems = list.Skip(i).Take(5);
                foreach(var item in fiveitems)
                {

                }
            }
于 2017-08-29T05:30:15.947 回答
2

以下静态扩展方法将使将列表分解为具有特定批量大小的多个列表的简单过程。

    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);
于 2015-03-26T16:41:38.000 回答