在C#中合并两个字典

5

了解了该问题的回答,那么如何合并两个(仅限)字典(.Net 4.5)?

不允许重复,以第一个为准(请参见下面的示例)。

using System;
using System.Linq;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var d1 = new Dictionary<int, string>();
        var d2 = new Dictionary<int, string>();
        // combine both, keep first duplicate only 
        var result = d1.XXX?(d2); 

    }
}

[<1,'a'>, <2, 'b'>] + [<3,'c'>, <1, 'x'>] = > [<1,'a'>, <2, 'b'>, <3,'c'>]


@DStanley 这里有一系列的字典,但我只有两个。我应该为此创建一个集合吗? - serge
@Serge,你可以使用var dicts = new [] {d1, d2}。使用join也可以,但在方法语法中它们要复杂得多。没有一个简单的内置函数可以做到这一点。 - D Stanley
可能是Merging dictionaries in C#的重复问题。 - johnny 5
即使指定了 .Net 的版本,我也看不出这个问题与您链接的那个问题有什么不同。 - johnny 5
@Serge 我的观点是,创建这种限制没有任何好处。原始问题的答案将合并字典。因此,使用一个简单的包装器来调用原始答案就可以了。如果你不知道如何构建一个包装器来调用原始答案,那么问题应该重新表述。 - johnny 5
显示剩余10条评论
2个回答

11

您可以这样合并它们:

var d1 = new Dictionary<int, string>() { [1] = "one" };
var d2 = new Dictionary<int, string>() { [1] = "un", [2] = "deux" };

var merged = d1.Concat(d2)
    .ToLookup(x => x.Key, x => x.Value)
    .ToDictionary(x => x.Key, g => g.First());

谢谢,注意一下 .NET 版本) 但我明白你的意思了!;) - serge
应该可用:https://learn.microsoft.com/zh-cn/dotnet/api/system.linq.enumerable.tolookup?view=netframework-4.5 - Xiaoy312
1
我的意思是你的字典初始化,它出现在C# 6中 ;) - serge
1
哦,确实不支持。 - Xiaoy312
3
虽然 ToLookup 也可以使用,但它比起 GroupBy 更加耗费资源,因为在创建最终的 Dictionary 前需要先在内存中创建另一个集合。我只有在需要查找操作时才会使用它。 - Tim Schmelter

11
您可以使用 ConcatGroupByFirst 进行操作:
var result = d1.Concat(d2)
               .GroupBy(kv => kv.Key)
               .ToDictionary(g => g.Key, g => g.First().Value);

请仅保留第一个值,不要重复(请参见原始问题示例),谢谢。 - serge
我明白了,但是你的回答是以一个在原始问题中没有被承认的假设为前提的。谢谢。 - serge
与另一个问题唯一的不同是我只有两个字典,而不是一个字典数组。我只是觉得创建一个只有两个字典的数组对我来说似乎不自然... - serge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接