NET問(wèn)答: 如何高效的合并兩個(gè) Dictionary ?

咨詢區(qū)
orip:
我現(xiàn)在有一個(gè)需求,需要對(duì)多個(gè) Dictionary<T1,T2> 進(jìn)行合并,我能想到的方法簽名大概是這樣的。
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);
請(qǐng)問(wèn)有什么簡(jiǎn)單粗暴的方法進(jìn)行合并,當(dāng)然這里還要處理 key 沖突的坑。
回答區(qū)
Jon Skeet:
多個(gè)字典合并的過(guò)程中如果發(fā)生key沖突,這時(shí)候就看你的場(chǎng)景了,如果是一定要拋異常的話,可以這樣寫。
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());
雖然上面代碼的寫法不那么好看,而且效率不是很高,但我覺(jué)得這是最簡(jiǎn)單粗暴的寫法了。??
orip:
其實(shí)很簡(jiǎn)單,如果你想合并多個(gè) Dictionary,我實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的 Merge 擴(kuò)展方法,代碼如下:
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) 即可。
點(diǎn)評(píng)區(qū)
這是一個(gè)很基礎(chǔ)的問(wèn)題,在實(shí)際開發(fā)中也會(huì)經(jīng)常遇到,對(duì)了,SelectMany + ToLookup + ToDictionary 三者配合簡(jiǎn)直一絕,我在實(shí)際開發(fā)中也經(jīng)常用到,學(xué)習(xí)了。
【推薦】.NET Core開發(fā)實(shí)戰(zhàn)視頻課程 ★★★
.NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門篇-開篇及總體規(guī)劃
【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開篇及目錄索引
Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)
.NET Core中的一個(gè)接口多種實(shí)現(xiàn)的依賴注入與動(dòng)態(tài)選擇看這篇就夠了
10個(gè)小技巧助您寫出高性能的ASP.NET Core代碼
用abp vNext快速開發(fā)Quartz.NET定時(shí)任務(wù)管理界面
在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度
現(xiàn)身說(shuō)法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化
