C#中Dictionary<char[],char>如何判断包含指定char[]键?
解决
Dictionary<char[], char>中按数组元素判断键存在的问题 嗨,这个坑我之前踩过!确实,默认的Dictionary对于引用类型(比如char[])是按引用地址判断相等的,所以哪怕两个数组的元素完全一样,只要不是同一个对象,ContainsKey就会返回false。要让字典按数组元素来比较键,咱们需要自定义一个相等比较器。
步骤1:实现自定义的数组相等比较器
首先,写一个实现IEqualityComparer<char[]>的类,让它用元素序列判断相等,同时生成匹配的哈希码(这对字典的高效查找至关重要):
public class CharArrayEqualityComparer : IEqualityComparer<char[]> { public bool Equals(char[] x, char[] y) { // 先处理null的情况,避免空引用异常 if (x == null && y == null) return true; if (x == null || y == null) return false; // 用SequenceEqual比较数组元素是否完全一致 return x.SequenceEqual(y); } public int GetHashCode(char[] obj) { if (obj == null) return 0; // 基于数组元素计算哈希码,确保相同元素的数组哈希码一致 int hashCode = 17; foreach (char c in obj) { hashCode = hashCode * 31 + c.GetHashCode(); } return hashCode; } }
步骤2:创建字典时传入自定义比较器
初始化Dictionary的时候,把咱们的比较器传进去,这样字典就会用元素相等的逻辑来判断键了:
// 创建字典时指定自定义比较器 Dictionary<char[], char> myDictionary = new Dictionary<char[], char>(new CharArrayEqualityComparer()); // 添加示例键值对 myDictionary.Add(new char[] {'a', 'b'}, 'x'); // 测试另一个元素相同的数组 char[] testArray = "ab".ToCharArray(); bool isContains = myDictionary.ContainsKey(testArray); // 这里isContains会返回true!
重要提醒
- 如果你之后修改了作为字典键的数组元素,字典的哈希表会出现混乱(因为哈希码变了),所以尽量不要修改已作为键的数组。如果可能,用
ReadOnlyCollection<char>代替char[]会更安全。 - 自定义的
GetHashCode方法必须和Equals逻辑匹配:如果两个数组Equals返回true,它们的GetHashCode必须相同,否则字典会出现查找错误。
内容的提问来源于stack exchange,提问作者user10609288
相关产品推荐
相关产品推荐

