c# - 如何加入两个词典?

标签 c# .net dictionary

我有两本字典。如果 dict2 中的值相同,那么我们必须添加 dict1 中匹配键的值,并在结果字典中生成结果,如下所示。

**dict1**                           **dict2**
Id         value                       Id          value
24379      348                         24379       270451
24368      348                         24368       270451
24377       90                         24377       270450
24366       90                         24366       270450
24369       10                         24369       270450   
24300       25

Result:
24379      696
24368      696
24377      190
24366      190
24369      190

我有以下逻辑,想优化这个解决方案:

Dictionary<int, int> result = new Dictionary<int, int>();

foreach (int itemKey in dict1.keys)
{
    result.add (itemKey, dict1.Where(a => dict2.ContainsKey(a.key) 
                                       && dict2.ContiansKey(itemKey) 
                                       && dict2[a.key] == dict2[itemKey])
                              .Sum(a => a.value);
}

最佳答案

您可以分两步完成:

  • 准备一个字典,根据dict2的值查找值
  • 遍历 dict1,并从查找字典中插入值

这里是你如何做到的:

var lookup = dict1
    .Where(p => dict2.ContainsKey(p.Key))
    .GroupBy(p => dict2[p.Key])
    .ToDictionary(g => g.Key, g => g.Sum(p => p.Value));
var res = dict1.Keys
        .Where(k => dict2.ContainsKey(k))
        .ToDictionary(k => k, k => lookup[dict2[k]]);

Demo.

关于c# - 如何加入两个词典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41418563/

相关文章:

haskell - 表示短位串的最佳方式是什么?

c# - 我想了解 @Html.DisplayFor(modelItem => item.FirstName) 中的 lambda 表达式

c# - 将时间跨度绑定(bind)到 slider

.net - 使用新的 csproj 格式 TransformXml?

.net - WeakReference.Target GC 后 WeakReference 会发生什么

.net - 向 Azure Batch 资源添加标签

c# - 如何让所有静态文件如css/images/js文件不被asp.net mvc处理?

c# - 我可以在没有 .net 中的 .config 文件的情况下指定 supportedRuntime(或任何其他配置参数)吗?

python - NetworkX g.neighbors(n) dict_keyiterator 错误信息

c# - 当 Key 等于订单号时,如何在字典中移动项目?