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


了解如何确定两个 Dictionary 对象是否相等是 C# 中一项基本技能。Dictionary 对象在将数据存储为键值对方面发挥着关键作用。本文将逐步指导您比较 C# 中的两个 Dictionary 对象。在本文结束时,您将了解如何准确有效地确定两个 Dictionary 对象是否相等。

在我们深入研究之前,需要说明的是,如果两个字典具有相同数量的键值对,并且一个字典中的每个键值对也存在于另一个字典中,则这两个字典被认为是相等的。

使用 SequenceEqual 方法

检查两个 Dictionary 对象是否相等的最简单方法之一是使用 System.Linq 命名空间中的 SequenceEqual 方法。

示例

以下是一个简单的示例:

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

public class Program {
   public static void Main() {
      Dictionary<string, int> dict1 = new Dictionary<string, int>() {
         {"One", 1},
         {"Two", 2},
         {"Three", 3}
      };

      Dictionary<string, int> dict2 = new Dictionary<string, int>() {
         {"One", 1},
         {"Two", 2},
         {"Three", 3}
      };

      bool areEqual = dict1.OrderBy(kv => kv.Key).SequenceEqual(dict2.OrderBy(kv => kv.Key));

      Console.WriteLine("Dictionaries equal: " + areEqual);
   }
}

在此代码片段中,我们首先使用 OrderBy 方法按键对字典进行排序。然后,我们使用 SequenceEqual 方法来确定两个有序序列是否相等。如果两个字典相等,则此方法将“Dictionaries equal: True”输出到控制台。

输出

Dictionaries equal: True

但是,此方法假设字典的键值对顺序相同。如果顺序不同,则此方法无法正常工作。

使用自定义 EqualityComparer

对于更复杂的情况,或者当字典的键值对顺序可能不同时,您可能需要使用自定义 EqualityComparer。

示例

以下是一个示例:

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

class DictionaryComparer<TKey, TValue> : IEqualityComparer<Dictionary<TKey, TValue>> {
   public bool Equals(Dictionary<TKey, TValue> x, Dictionary<TKey, TValue> y) {
      // Check whether the dictionaries are equal
      return x.Count == y.Count && !x.Except(y).Any();
   }

   public int GetHashCode(Dictionary<TKey, TValue> obj) {
      int hash = 0;
      foreach (var pair in obj) {
         hash ^= pair.GetHashCode();
      }
      return hash;
   }
}

public class Program {
   public static void Main() {
      Dictionary<string, int> dict1 = new Dictionary<string, int>() {
         {"One", 1},
         {"Two", 2},
         {"Three", 3}
      };

      Dictionary<string, int> dict2 = new Dictionary<string, int>() {
         {"One", 1},
         {"Two", 2},
         {"Three", 3}
      };

      DictionaryComparer<string, int> comparer = new DictionaryComparer<string, int>();
      bool areEqual = comparer.Equals(dict1, dict2);

      Console.WriteLine("Dictionaries equal: " + areEqual);
   }
}

在此示例中,我们创建了一个自定义相等比较器,它实现了 IEqualityComparer 接口。Equals 方法检查两个字典是否具有相同数量的元素,以及第一个字典中是否存在任何不在第二个字典中的元素。GetHashCode 方法计算字典的哈希码,用于性能优化。

输出

Dictionaries equal: True

结论

在 C# 中,您可以使用 SequenceEqual 方法或自定义 EqualityComparer 来检查两个 Dictionary 对象是否相等。虽然 SequenceEqual 方法快速便捷,但如果字典的键值对顺序不同,则它可能无法正常工作。在这种情况下,自定义 EqualityComparer 可以提供更准确的比较。

更新于:2023年7月24日

5K+ 阅读量

开启您的 职业生涯

通过完成课程获得认证

立即开始
广告