How to compare two dictionaries tuple values in c#

Viewed 343

I have two dictionaries with one key and value as tuple (two values). I want to do the following:

  • compare both dictionaries on the basis of key. If keys are matched, then their tuple should be compare.
  • also if both dictionaries contain different key i.e. unmatched key, it should give an error.

It can be either linq expression or simple loops and check.

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

2 Answers

You can do it like so:

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;
    }
}

And then to use it:

        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

Update Thanks to Aluan Haddad for pointing out the sorting issue.

Assuming you are looking to check if the dictionaries are equal or not, you can use the following code

// 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;
}
Related