从两个字典中删除公用键,并将剩余的字词添加到新的第三个字典中?

时间:2018-07-01 17:13:29

标签: c# visual-studio

我有两个字典dict1和dict2。

我删除了公用密钥并存储在otherEntry中。

var otherEntry = dict1.Keys.Except(dict2.Keys);

如何将“ otherEntry”的数据添加到新的Dictionary dict3中?

4 个答案:

答案 0 :(得分:3)

根据我对要求的理解

  

将两个词典中所有不常见的项目都放入,并放入新词典中

请考虑以下内容

var dict3 = dict1.Concat(dict2)
    .GroupBy(_ => _.Key)
    .Where(_ => _.Count() == 1)
    .SelectMany(_ => _)
    .ToDictionary(_ => _.Key, _ => _.Value);

按键对两个集合进行分组,并仅采用单个项目组,因为这将排除两个集合中都存在的项目,而其余部分则保留下来。

从那里开始,只需根据其余项目创建字典即可。

答案 1 :(得分:3)

我会说

Dictionary<string, string> dict1 = new Dictionary<string, string>();
dict1.Add("abc", "hello");
dict1.Add("def", "world");

Dictionary<string, string> dict2 = new Dictionary<string, string>();
dict2.Add("hij", "bonjour");
dict2.Add("abc", "le monde");


 Dictionary<string, string> dict3 = dict1
 .Where(kvp => !dict2.ContainsKey(kvp.Key))
 .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

答案 2 :(得分:2)

您只需要将otherEntrydict1一起加入即可。 Join运算符将返回IEnumerable,您需要使用ToDictionary方法将其转换为Dictionary,因为您希望将Dictionary作为结果。

dict1
    .Join(otherEntry, d1 => d1.Key, other => other, (d1, other) => d1)
    .ToDictionary(d1 => d1.Key, d1 => d1.Value);

或者,您也可以使用等效于左外部联接的LINQ来实现相同的结果

var otherEntry = 
        from d1 in dict1
        join d2 in dict2 on d1.Key equals d2.Key into matchingGroup
        where !matchingGroup.Any()
        select d1;

var dict3 = otherEntry.ToDictionary(d3 => d3.Key, d3 => d3.Value);

答案 3 :(得分:1)

您可以通过循环foreach进行操作

foreach (KeyValuePair<string, List<string>> item in dict1) {
  otherEntry.Add(item);
  if (dict2.ContainsKey(item.Key)) {
    dict2.Remove(item.Key);
  }
}

然后

foreach (KeyValuePair<string, List<string>> item in dict2) {
  otherEntry.Add(item);
}