我有一个对象列表,每个对象有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匹配...
我错过了一个非常简单的方法吗?我不敢相信这很困难,但我还没能解决它。
答案 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}
。我怀疑开销是否会引人注意,但这是值得关注的事情。