如何比较c#中的两个字典元组值



我有两个字典,其中一个键和一个值作为元组(两个值(。我想做以下事情:

  • 根据关键字比较两本词典。如果键匹配,则应该比较它们的元组
  • 此外,如果两个字典都包含不同的关键字,即不匹配的关键字,则会出现错误

它可以是linq表达式,也可以是简单的循环和检查。

Dictionary<string, Tuple<string, string>> dict1= new Dictionary<string, Tuple<string, string>>();
Dictionary<string, Tuple<string, string>> dict2= new Dictionary<string, Tuple<string, string>>();

你可以这样做:

using System.Linq;
using System.Collections.Generic;
public static class DictionaryExtensions {
public static bool IsEqualTo(this Dictionary<string, Tuple<string, string>> dict1, Dictionary<string, Tuple<string, string>> dict2) {
if (!Enumerable.SequenceEqual(dict1.Keys.OrderBy(x => x), dict2.Keys.OrderBy(x => x))) {
return false;
}

foreach(var kvp in dict1) {
var corresponding = dict2[kvp.Key];

if (kvp.Value.Item1 != corresponding.Item1 || kvp.Value.Item2 != corresponding.Item2) {
return false;
}
}

return true;
}
}

然后使用它:

Dictionary<string, Tuple<string, string>> dict1= new Dictionary<string, Tuple<string, string>>();
Dictionary<string, Tuple<string, string>> dict2= new Dictionary<string, Tuple<string, string>>();

Console.WriteLine(dict1.IsEqualTo(dict2)); // True

dict1["a"] = new Tuple<string, string>("a", "b");
dict2["a"] = new Tuple<string, string>("a", "b");

Console.WriteLine(dict1.IsEqualTo(dict2)); // True

dict2["a"] = new Tuple<string, string>("a", "b2");

Console.WriteLine(dict1.IsEqualTo(dict2)); // False
dict2["a"] = new Tuple<string, string>("a", "b");
dict2["b"] = new Tuple<string, string>("a", "b2");
Console.WriteLine(dict1.IsEqualTo(dict2)); // False

更新感谢Aluan Haddad指出排序问题。

假设您要检查字典是否相等,则可以使用以下代码

// Checks if the dictionaries are equal
public static bool AreDictionriesEqual(Dictionary<string, Tuple<string, string>> dict1, Dictionary<string, Tuple<string, string>> dict2)
{
// Check if the number of items are the same
if (dict1.Count != dict2.Count)
return false;
// Get set of keys in both dictionaries
var dict1Keys = dict1.Select(item => item.Key);
var dict2Keys = dict2.Select(item => item.Key);
// Check if the set of keys are the same
if (!dict1Keys.All(key => dict2Keys.Contains(key)))
return false;
// Check if the strings in tuples are the same
foreach(var item in dict1)
{
// Get first items
var string1_Dict1 = item.Value.Item1;
var string1_Dict2 = dict2[item.Key].Item1;
// Check first items
if (!string1_Dict1.Equals(string1_Dict2))
return false;
// Get second items
var string2_Dict1 = item.Value.Item2;
var string2_Dict2 = dict2[item.Key].Item2;
// Check second items
if (!string2_Dict1.Equals(string2_Dict2))
return false;
}
// If we reach end, return true
return true;
}

最新更新