2011-08-17 4 views
0

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

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

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

私はこれを行うには完全に簡単な方法がありませんか?私はそれが非常に難しいとは信じられませんが、私はまだそれを解決することができませんでした。

答えて

1

自分の質問に答えるのではなく、それは同様のbrainblockを持っていた誰かに使用であるかもしれないとして、それを削除する:

私は物事が複雑になり過ぎた - 私はちょうどで新しいリストを作成し、返し終わっています新しい行+処理を必要としなかった行。

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}。私はオーバーヘッドが目立つことは疑うが、それは目を維持するためのものだ。

関連する問題