比较两个字典(Key,value)并返回不具有相同值的Key

Bis*_*ana 7 .net c# dictionary

我对 C# 有点陌生,想要在比较两个字典时识别不具有相同值的键。

我的字典是dict => KeyValuePair<string, string>。我有两本字典,比如 -

dict1 => {"a":"False","b":"amazonaws.com","c":"True"}
dict2 => {"a":"True","b":"amazonaws.com","c":"False"}
Run Code Online (Sandbox Code Playgroud)

我想比较两个字典并返回一个具有键 ["a", "c"] 的变量,如上面的示例所示,这些键具有不同的值。

目前我编写的逻辑只会区分其他字典中不存在的键。

Dictionary dictExcept = null;
foreach (IDictionary kvp in dict1.Cast<object>().Where(kvp => !dict2.Contains(kvp)))
    {
        dictExcept.Add(kvp.Keys, kvp.Values);
    }
return dictExcept ;
Run Code Online (Sandbox Code Playgroud)

Dmi*_*nko 1

您可以尝试使用TryGetValue

using System.Linq;

...

var dictExcept = dict1
  .Where(pair => dict2.TryGetValue(pair.Key, out var value) && 
                 pair.Value != value)
  .ToDictionary(pair => pair.Key, 
                pair => (first: pair.Value, second: dict2[pair.Key]));
Run Code Online (Sandbox Code Playgroud)

这里我们对每个键值pairfromdict1尝试获取对应的valuefrom dict2

// dict2 has pair.Key it corresponds to value...
dict2.TryGetValue(pair.Key, out var value) && 
// however value from dict2 != value from dict1
pair.Value != value
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢使用,则完全相同的想法foreach(无Linq解决方案):

var dictExcept = new Dictionary<string, (string first, string second)>();

foreach (var pair in dict1)
  if (dict2.TryGetValue(pair.Key, out var value) && value != pair.Value)
    dictExcept.Add(pair.Key, (pair.Value, value)); 
Run Code Online (Sandbox Code Playgroud)

演示:(小提琴

  var dict1 = new Dictionary<string, string> { 
    { "a", "False" }, { "b", "False" }, { "c", "True" }, { "d", "dict1 only" } };

  var dict2 = new Dictionary<string, string> { 
    { "a", "False" }, { "b", "True" }, { "c", "False" }, { "e", "dict2 only" } };

  var dictExcept = dict1
    .Where(pair => dict2.TryGetValue(pair.Key, out var value) &&
                   pair.Value != value)
    .ToDictionary(pair => pair.Key,
                  pair => (first: pair.Value, second: dict2[pair.Key]));

  string report = string.Join(Environment.NewLine, dictExcept
    .Select(pair => $"Key: {pair.Key}; Values: {pair.Value}"));

  Console.Write(report);
Run Code Online (Sandbox Code Playgroud)

结果:

Key: b; Values: (False, True)
Key: c; Values: (True, False)
Run Code Online (Sandbox Code Playgroud)