0

2 つの文字列属性といくつかの double 属性を持つオブジェクトのリストがあります。文字列属性は同じですが、double 属性は異なるという意味で、重複した行があります。これらの重複を、double 属性の値から計算される単一の新しい行にマージしようとしています。簡単な例:

1. A, Text1, 5
2. A, Text2, 4
3. B, Text1, 7
4. A, Text1, 3

「計算された行」を単純な平均として取ると、次のようになります。

1. A, Text1, 4 (5+3)/2
2. A, Text2, 4
3. B, Text1, 7

これは私が現在行っていることです:

var groups = (from t in MyList group t by new { t.Field1, t.Field2});
foreach (var @group in groups)
{
   if (@group.Count() > 1)
   {         
      var newRow = new MyObject
                       {
                          Field1 = @group.ElementAt(0).Field1,
                          Field2 = @group.ElementAt(0).Field2,
                          Field3 = @group.Average(i => i.Field3)
                       };                        
   }
}

これはうまくいきます。グループに使用できるメソッドがないため、繰り返し処理しているグループの行を置き換える方法がわかりませんremove。私は元々、ネストされたforループ比較のクーペでこれを行おうとしましたが、リストを変更できなかったため、一致するインデックスを保存して繰り返していましたが、n * (n-1) / 2の一致があったことを意味しました...

これを行うための完全に簡単な方法がありませんか?とても難しいとは信じられませんが、まだ解決できていません。

4

1 に答える 1

1

同様の脳ブロックを持っている人に役立つ可能性があるため、削除するのではなく、自分の質問に答えます。

私は物事を複雑にしすぎていました-新しい行と処理を必要としない行を含む新しいリストを作成して返すだけになりました。

var groups = (from t in MyList group t by new { t.Field1, t.Field2 });
var returnList = new List<MyObject>();
foreach (var @group in groups)
{ 
   returnList.Add(new TradeScore
                      {
                         Field1 = @group.ElementAt(0).Field1,
                         Field2 = @group.ElementAt(0).Field2,
                         Field3 = @group.Average(i => i.Field3)
                      });
}
return returnList;

シンプル。

これ、アイテムが 1 つしかない場合でも、すべてのグループで処理を行うことに注意してください。処理する必要はありませんが、1 つの値の平均は明らかにその値であり、余分なif(...) {process and add} else {add}. オーバーヘッドが目立つとは思えませんが、注意が必要です。

于 2011-08-17T09:38:08.440 に答える