NET问答: 如何高效的合并两个 Dictionary ?

DotNetCore实战

共 2594字,需浏览 6分钟

 ·

2021-06-09 12:17


咨询区

  • orip

我现在有一个需求,需要对多个 Dictionary<T1,T2> 进行合并,我能想到的方法签名大概是这样的。


public static Dictionary<TKey,TValue> Merge<TKey,TValue>(Dictionary<TKey,TValue>[] dictionaries);

或者


public static Dictionary<TKey,TValue> Merge<TKey,TValue>(IEnumerable<Dictionary<TKey,TValue>> dictionaries);

请问有什么简单粗暴的方法进行合并,当然这里还要处理 key 冲突的坑。

回答区

  • Jon Skeet

多个字典合并的过程中如果发生key冲突,这时候就看你的场景了,如果是一定要抛异常的话,可以这样写。


var result = dictionaries.SelectMany(dict => dict).ToDictionary(pair => pair.Key, pair => pair.Value);

如何是 重写 或者 忽略,那么可以这样写。


var result = dictionaries.SelectMany(dict => dict)
                         .ToLookup(pair => pair.Key, pair => pair.Value)
                         .ToDictionary(group => group.Key, group => group.First());

虽然上面代码的写法不那么好看,而且效率不是很高,但我觉得这是最简单粗暴的写法了。😖

  • orip

其实很简单,如果你想合并多个 Dictionary,我实现了一个简单的 Merge 扩展方法,代码如下:


using System.Collections.Generic;
...
public static Dictionary<TKey, TValue> Merge<TKey,TValue>(IEnumerable<Dictionary<TKey, TValue>> dictionaries)
{
    var result = new Dictionary<TKey, TValue>();
    foreach (var dict in dictionaries)
        foreach (var x in dict)
            result[x.Key] = x.Value;
    return result;
}

如果key冲突我这里采用的是 覆盖,如果不处理冲突,那就把 result[x.Key] = x.Value 改成 result.Add(x.Key,x.Value) 即可。

点评区

这是一个很基础的问题,在实际开发中也会经常遇到,对了,SelectMany + ToLookup + ToDictionary 三者配合简直一绝,我在实际开发中也经常用到,学习了。


往期精彩回顾




【推荐】.NET Core开发实战视频课程 ★★★

.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

【.NET Core微服务实战-统一身份认证】开篇及目录索引

Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)

.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

10个小技巧助您写出高性能的ASP.NET Core代码

用abp vNext快速开发Quartz.NET定时任务管理界面

在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度

现身说法:实际业务出发分析百亿数据量下的多表查询优化

关于C#异步编程你应该了解的几点建议

C#异步编程看这篇就够了


浏览 43
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报