c# - 在两个 IEnumerable 集合中添加项目的值

标签 c# algorithm linq

我有两个通用对象的 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/

相关文章:

C# 给列表框添加点击事件

java - 朴素贝叶斯文本分类算法

linq - 将 Linq 与 WCF 结合使用

c# - 如何向下滚动到多行 TextBox 的底线,Javascript 的 scrollIntoView 对此不起作用

c# - WPF - 如何将组合框选择的值添加到数据库

java - 使用回溯在 Java 中解决数独问题

c# - 带有 resultselector 重载的 Linq GroupBy 方法有什么用?

c# - 使用 LINQ 创建列表

c# - 打印字符串

java - 查找尚未使用的最简单整数组合的算法