合并两个字典对c#not pure concat

时间:2015-05-20 14:44:56

标签: c# .net linq dictionary

我有两个词典。

Dictionary<string, string> testDict = new Dictionary<string, string>();
            testDict.Add("Name", "John");
            testDict.Add("City", "NY");

Dictionary<string, string> DictA = new Dictionary<string, string>();
            DictA.Add("Name", "Sarah");
            DictA.Add("State", "ON");

我希望得到一个字典,以便testDict的键存在,并且存在DictA中存在的那些键的值。

因此示例合并字典应如下所示:

Dictionary<string, string> DictMerged = new Dictionary<string, string>();
                DictMerged.Add("Name", "Sarah");
                DictMerged.Add("City", "NY");

我希望我已经能够解释我的要求..

我试过..

testDict.Concat(DictA)
  .GroupBy(kvp => kvp.Key, kvp => kvp.Value)
  .ToDictionary(g => g.Key, g => g.Last());

但这也给了我DictA'State',我不想要......

真心感谢任何帮助

由于

3 个答案:

答案 0 :(得分:5)

我认为你正在寻找这个:

var result = 
    testDict.ToDictionary(
             i => i.Key, 
             i => DictA.ContainsKey(i.Key) ? DictA[i.Key] : i.Value);

// result:
// {"Name", "Sarah"}
// {"City", "NY"}

答案 1 :(得分:2)

如果您定义了GetOrDefault扩展方法here

然后你可以做

var result = testDict.ToDictionary(
    kvp => kvp.Key, 
    kvp => DictA.GetOrDefault(kvp.Key, kvp.Value));

这与使用DictA.ContainsKey(kvp.Key) ? DictA[kvp.Key] : i.Value之间的区别在于,DictA只进行了一次查找,而当密钥存在时,只有两次查找。

答案 2 :(得分:0)

这样可行

        var testDict = new Dictionary<string, string> { { "Name", "John" }, { "City", "NY" } };
        var DictA = new Dictionary<string, string> { { "Name", "Sarah" }, { "State", "ON" } };
        var mergedDict = testDict.ToDictionary(keyVal => keyVal.Key, keyVal => DictA.ContainsKey(keyVal.Key) ? DictA[keyVal.Key] : keyVal.Value);