用新的计算行替换列表中的项组
本文关键字:列表 计算 替换 | 更新日期: 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}
。我怀疑开销是否会被注意到,但这是值得关注的。