📜  检查两个字典对象在C#中是否相等(1)

📅  最后修改于: 2023-12-03 15:10:51.562000             🧑  作者: Mango

在C#中检查两个字典对象是否相等

在C#中,Dictionary是一个非常有用的数据结构。如果需要在代码中比较两个字典对象是否相等,可以使用以下方法:

方法1:使用SequenceEqual()方法

Dictionary类实现了IEnumerable<KeyValuePair<TKey, TValue>>接口,所以可以使用Linq的SequenceEqual()方法来比较两个Dictionary对象是否相同。

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var dict1 = new Dictionary<int, string>
        {
            { 1, "apple" },
            { 2, "orange" },
            { 3, "banana" }
        };

        var dict2 = new Dictionary<int, string>
        {
            { 1, "apple" },
            { 2, "orange" },
            { 3, "banana" }
        };

        var dict3 = new Dictionary<int, string>
        {
            { 1, "apple" },
            { 2, "grape" },
            { 3, "banana" }
        };

        Console.WriteLine(dict1.SequenceEqual(dict2)); // True
        Console.WriteLine(dict1.SequenceEqual(dict3)); // False
    }
}
方法2:实现IEqualityComparer接口

另一种比较两个字典是否相等的方法是实现IEqualityComparer接口,并将其传递给Dictionary<TKey, TValue>的构造函数。

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        var dict1 = new Dictionary<int, string>
        {
            { 1, "apple" },
            { 2, "orange" },
            { 3, "banana" }
        };

        var dict2 = new Dictionary<int, string>
        {
            { 1, "apple" },
            { 2, "orange" },
            { 3, "banana" }
        };

        var dict3 = new Dictionary<int, string>
        {
            { 1, "apple" },
            { 2, "grape" },
            { 3, "banana" }
        };

        var comparer = new DictionaryComparer<int, string>();

        Console.WriteLine(comparer.Equals(dict1, dict2)); // True
        Console.WriteLine(comparer.Equals(dict1, dict3)); // False
    }

    class DictionaryComparer<TKey, TValue> : IEqualityComparer<Dictionary<TKey, TValue>>
    {
        public bool Equals(Dictionary<TKey, TValue> x, Dictionary<TKey, TValue> y)
        {
            if (x.Count != y.Count)
            {
                return false;
            }

            foreach (var pair in x)
            {
                TValue value;
                if (y.TryGetValue(pair.Key, out value))
                {
                    if (!pair.Value.Equals(value))
                    {
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }

            return true;
        }

        public int GetHashCode(Dictionary<TKey, TValue> obj)
        {
            int hash = 0;

            foreach (var pair in obj)
            {
                hash ^= pair.Key.GetHashCode() ^ pair.Value.GetHashCode();
            }

            return hash;
        }
    }
}

上面的示例中,我们实现了IEqualityComparer<Dictionary<TKey, TValue>>接口,并将其传递给了Dictionary<int, string>的构造函数。Equals()方法现在会比较两个字典对象是否相等,并返回一个布尔值。GetHashCode()方法返回一个哈希码,用于快速比较两个字典对象是否相等。

这两种方法都可以用来比较两个字典对象是否相等。使用哪个方法取决于您的具体需求和标准。