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

csharpserver side programmingprogramming

了解如何确定两个 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) {
      // 检查字典是否相等
      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("字典相等: " + areEqual);
   }
}

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

输出

字典相等:True

结论

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


相关文章