我有两个通用对象的 IEnumerable 集合。每个对象都有一个名称和值属性。名称是字符串,值是 double 。
我想将两者合并为一个并添加值属性。例如,假设一个对象同时存在于两个集合中并具有以下属性:
Collection 1: Collection 2:
Name: Var1 Name: Var1
Value: 2.67 Value: 4.32
在最后的集合中,我想将以上两个合并为:
Result Collection:
Name: Var1
Value: 6.99
我知道使用 foreach 循环执行此操作的艰难/漫长的方法,通过遍历每个循环非常昂贵,因为我的集合每个都有大约 150,000 个对象。但是,我想知道是否有更简单快捷的方法使用 Linq 来完成这项工作?
更新以回应 Yuval Itzchakov 的评论:
我尝试过的漫长/困难的方法是:
foreach(var item in collection1)
{
if(collection2.where(x => x.Name == item.Name).Count() == 1)
{
item.value += collection2.First(x => x.Name == item.Name).value;
}
}
最佳答案
可以使用 GroupBy 实现包含重复键的情况的最通用解决方案。和 Sum LINQ 方法:
var result = firstCollection
.Concat(secondCollection)
.GroupBy(x => x.Name)
.Select(g => new Foo { Name = g.Key, Value = g.Sum(f => f.Value) });
// Foo is an example of your element class. You can use anonymous classes
//.Select(g => new { Name = g.Key, Value = g.Sum(f => f.Value) });
此解决方案的算法复杂度为 O(n)。
如果你想获得最大的性能,你可以使用序号字符串比较:
var result = firstCollection
.Concat(secondCollection)
.GroupBy(x => x.Name, x => x, StringComparer.Ordinal)
.Select(g => new Foo { Name = g.Key, Value = g.Sum(f => f.Value) });
关于c# - 在两个 IEnumerable 集合中添加项目的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34439613/