使用linq合并两个具有重复键的字典

mgdq6dx1  于 2022-12-06  发布在  其他
关注(0)|答案(7)|浏览(134)

如何合并IDictionary<Guid, MyObject>的两个字典,其中MyObject是一个类示例?

IDictionary<Guid, MyObject> d1 = new Dictionary<Guid, MyObject>();
d1.Add(guid1, m1);
d1.Add(guid2, m2);
d1.Add(guid3, m3);
IDictionary<Guid, MyObject> d2 = new Dictionary<Guid, MyObject>();
d2.Add(guid2, m2);
d2.Add(guid3, m3);
d2.Add(guid4, m4);
IDictionary<Guid, MyObject> d3 = d1.Union(d2) ???

d3中有以下条目:

guid1,m1
guid2,m2
guid3,m3
guid4,m4
ma8fv8wu

ma8fv8wu1#

d1.Concat(d2.Where( x=> !d1.Keys.Contains(x.Key)));
c90pui9n

c90pui9n2#

d1.Union(d2).GroupBy (kvp => kvp.Key).ToDictionary(kvp => kvp.Key, kvp => kvp.First().Value);出来做这个把戏。

IDictionary<Guid, MyObject> d1 = new Dictionary<Guid, MyObject>();
d1.Add(guid1, m1);
d1.Add(guid2, m2);
d1.Add(guid3, m3);
IDictionary<Guid, MyObject> d2 = new Dictionary<Guid, MyObject>();
d2.Add(guid2, m2);
d2.Add(guid3, m3);
d2.Add(guid4, m4);
IDictionary<Guid, MyObject> d3 = 
   d1.Union(d2).GroupBy (kvp => kvp.Key)
       .ToDictionary (kvp => kvp.Key, kvp => kvp.First ().Value);
tpgth1q7

tpgth1q73#

如果你有重复的键,那么你必须使用where子句来处理重复的键。

var result = d1.Union(d2.Where(k => !d1.ContainsKey(k.Key))).ToDictionary(k => k.Key, v => v.Value)

**注意:**它不会获得重复键。如果存在任何重复键,则它将获得d1的键。

b4wnujal

b4wnujal4#

你可以试试

d1.Concat(d2).Distinct(kv => kv.Key).ToDictionary(kv => kv.Key, kv => kv.Value)

concat的结果利用了字典是IEnumerable<KeyvaluePair<Guid,MyObject>>的事实
因为我没有编译器,我只是检查了Distinct不能只接受一个lambda来选择要比较的属性。但是它可以接受一个EqualityComparer。我经常在项目中使用的是一个泛型等式比较器,它允许传入定义等式操作的lambda。

rggaifut

rggaifut5#

工会看起来不错:http://msdn.microsoft.com/en-us/vcsharp/aa336761.aspx#union1

pdtvr36n

pdtvr36n6#

这将合并唯一键和唯一值列表:

d1.Union(d2).GroupBy(g => g.Key).ToDictionary(pair => pair.Key, pair => pair.First().Value.Union(pair.Last().Value).ToList());
tp5buhyn

tp5buhyn7#

如果不存在重复的关键字,则以下方法适用于2个(或更多)字典:

var dictionaries = new [] { d1, d2 };
var result = dictionaries.SelectMany(dict => dict)
                     .ToDictionary(pair => pair.Key, pair => pair.Value);

相关问题