5

96 個の値を持つコレクションがあります。4 つの順次インデックスの値を合計したいと思います。Linq を使用してこれを行うにはどうすればよいですか?

collection = {100, 101, 200, 150, 103, 105, 100, 104,  .........., 20, 40, 60, 80};

Sum of (100, 101, 200, 150;)then sum of (103, 105, 100, 104;)... then sum of(20, 40, 60, 80;)これは、新しいコレクションが 24 個の値を持つことを意味します。

Linq を使用してこれを行うにはどうすればよいですか?

4

6 に答える 6

11

このユーティリティ関数を使用Batchして、特定のバッチ サイズに基づいてアイテムを作成できます。

public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> source, int batchSize)
{
    List<T> buffer = new List<T>(batchSize);

    foreach (T item in source)
    {
        buffer.Add(item);

        if (buffer.Count >= batchSize)
        {
            yield return buffer;
            buffer = new List<T>(batchSize);
        }
    }
    if (buffer.Count > 0)
    {
        yield return buffer;
    }
}

その後は次のように簡単です。

var query = data.Batch(4)
    .Select(batch => batch.Sum());
于 2013-06-11T17:46:07.630 に答える
4

次のようにグループ化しindex/4て合計を取得できます。

var res = collection
    .Select((v,i) => new {v, i})
    .GroupBy(p => p.i / 4)
    .Select(g => g.Sum(p.v));
于 2013-06-11T17:49:27.263 に答える
3

インデックスからグループ インデックスを計算し、それをグループ化し、各グループの値から合計を取得できます。

var sums = collection
.Select((n, i) => new { Group = i / 4, Value = n })
.GroupBy(x => x.Group)
.Select(g => g.Sum(y => y.Value));
于 2013-06-11T17:49:37.357 に答える
1

新しい拡張メソッドが必要になりますPartition:

public static IEnumerable<IEnumerable<T>> Partition<T>(
    this IEnumerable<T> source, int partitionSize)
{
    var counter = 0;
    var result = new T[partitionSize];
    foreach(var item in source)
    {
        result[counter] = item;
        ++counter;
        if(counter >= partitionSize)
        {
            yield return result;
            counter = 0;
            result = new T[partitionSize];
        }
    }

    if(counter != 0)
        yield return result.Take(counter);
}

使用法は次のとおりです。

collection.Partition(4).Select(x => x.Sum())

これは、 ServyBatchによって投稿された方法の代替方法です。

于 2013-06-11T17:51:09.717 に答える
1

まず、セットをインデックスでグループ化する方法を作成します。この場合、整数除算を使用して要素 0 ~ 3 をグループ 0、4 ~ 7 をグループ 1 などにすることを選択しました。

次に、集計が必要なさまざまなセットに要素をグループ化します (グループ化キーによって)。

最後に、各グループに属する要素の合計を選択します。

values.Select((x, i) => new { GroupingKey = i/4, Value = x })
      .GroupBy(x => x.GroupingKey)
      .Select(x => new { Group = x.Key, Sum = x.Sum() });
于 2013-06-11T17:52:15.180 に答える