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实战项目之CMS 第一章 入门篇-开篇及总体规划
【.NET Core微服务实战-统一身份认证】开篇及目录索引
Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)
.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
用abp vNext快速开发Quartz.NET定时任务管理界面
评论