0

我有一个对象列表,每个对象有 2 个字符串属性和几个双属性 - 从字符串属性相同的意义上讲,存在重复的行,而双属性不同。我正在尝试将这些重复项合并到一个新行中,该行是根据双属性的值计算的。简化示例:

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 个项目的组。虽然它们不需要处理,但一个值的平均值显然是那个值,它避免了额外的if(...) {process and add} else {add}. 我怀疑开销会很明显,但需要注意。

于 2011-08-17T09:38:08.440 回答