1

抱えている問題について助けが必要です。契約、分割払い、金額など、いくつかのフィールドを含むリストがあります。

もちろん、他のすべてのフィールドを含め、これらのフィールドに基づいて新しいリストを作成する必要があります。

したがって、2 回払いの契約ごとに、最初の分割払いの金額を合計し、2 回目の分割払いを維持する必要があります。

以下に例を示します。

これは可能ですか?

...contract    instalment    amount ...
...1           1             100    ... 
...1           2             1000   ...
...2           1             100    ...
...3           1             1000   ...
...4           1             200    ...
...4           2             100    ...
...5           1             1000   ...

...contract    instalment    amount ...
...1           1             1100   ... 
...1           2             1000   ...
...2           1             100    ...
...3           1             1000   ...
...4           1             300    ...
...4           2             100    ...
...5           1             1000   ...
4

2 に答える 2

2

私はあなたが欲しいと思います:

var result = from record in records
             group record by record.Contract into contractGroup
             let orderedGroup = contractGroup.OrderBy(r => r.Instalment).ToList()
             let aggregatedItem = new Record 
                                  {
                                      Contract = contractGroup.Key,
                                      Instalment = orderedGroup.First().Instalment,
                                      Amount = orderedGroup.Sum(r => r.Amount) 
                                  }
             from resultRecord in new[] { aggregatedItem }
                                        .Concat(orderedGroup.Skip(1))              
             select resultRecord;

サンプルでは、​​グループに 1 つまたは 2 つのアイテムが含まれる場合のみを処理しますが、上記のコードは、他のすべてのアイテムから最初のアイテムを集約することにより、グループ内の 3 つ以上のアイテムに対しても機能することに注意してください。

編集

新しいレコードを作成するのではなく、各グループの最初のレコードを変更したいので、次のようにします。

foreach(var contractGroup in records.GroupBy(record => record.Contract))
{
     // Use Aggregate or a dedicated MinBy operator
     // if you don't want the sorting overhead.
     var aggregateItem = contractGroup.OrderBy(record => record.Instalment)
                                      .First();     

     aggregateItem.Amount = contractGroup.Sum(record => record.Amount);  
}

// Now use 'records' as before as the subsequent data-source.
于 2012-08-20T12:37:47.343 に答える
2

以下の単純な LINQ を介して結果を取得できます。

var output = input.GroupBy(record => record.Contract)
            .SelectMany(group =>
                {
                    group.First().Amount = group.Sum(r => r.Amount);
                    return group;
                })
            .ToList();     
于 2012-08-20T15:47:56.787 に答える