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

MoreLINQBatchからの演算子が必要なようです:

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 に答える
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 に答える