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

本文关键字:列表 计算 替换 | 更新日期: 2023-09-27 18:05:44

我有一个对象列表,每个对象有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个匹配…

我错过了一个非常简单的方法来做到这一点吗?我真不敢相信这么难,可我到现在还没算出来。

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

回答我自己的问题,而不是删除它,因为它可能对有类似大脑阻塞的人有用:

我把事情弄得太复杂了——我最终只是创建并返回一个包含新行和不需要处理的行的新列表。

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}。我怀疑开销是否会被注意到,但这是值得关注的。