Linq每次迭代选择5项

时间:2012-07-11 07:13:08

标签: c# linq

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枚举器,并使多重性能够构成新结果集的边界。

5 个答案:

答案 0 :(得分:40)

听起来你想要来自BatchMoreLINQ运营商:

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);