2011-08-17 40 views
0

我有一个对象列表,每个对象有两个字符串属性和几个双重属性 - 在字符串属性相同的意义上有重复的行,而双属性是不同的。我试图将这些重复项合并成一个新的行,它是根据双重属性的值计算出来的。简单的例子:用新的计算行替换列表中的项目组

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。我原本试图用一个循环比较嵌套的coupe来做到这一点,但由于我无法修改列表,我正在遍历我存储的匹配索引,但意味着我有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; 

简单。

注意这个确实对所有组进行处理,即使那些只有一个项目的组。虽然他们不需要处理,但一个值的平均值显然是该值,并且它避免了额外的if(...) {process and add} else {add}。我怀疑这些开销会显而易见,但这是值得关注的。

相关问题