用新计算的行替换列表中的项目组

时间:2011-08-17 08:55:44

标签: c# grouping duplicate-removal

我有一个对象列表,每个对象有2个字符串属性和一些双重属性 - 在字符串属性相同的意义上有重复的行,而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循环比较的coupe来做这个,但由于我无法修改列表,我正在迭代我存储的匹配索引,但是 意味着我有n *( n-1)/ 2匹配...

我错过了一个非常简单的方法吗?我不敢相信这很困难,但我还没能解决它。

1 个答案:

答案 0 :(得分: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;

Simples。

请注意, 对所有群组进行处理,即使只有1个群组也是如此。虽然它们不需要处理,但是一个值的平均值显然是该值,并且它避免了额外的if(...) {process and add} else {add}。我怀疑开销是否会引人注意,但这是值得关注的事情。