为什么我的字典包含两个键相同的条目?
本文关键字:我的 字典 包含两 为什么 | 更新日期: 2023-09-27 18:08:29
我创建了一个这样的字典:
Dictionary<byte[], MyClass> dic = new Dictionary<byte[], MyClass>();
密钥被假设为20字节的SHA1哈希。因此,在向字典中添加了两个条目后,我使用调试器进行了检查,两者都具有相同的字节数组键。
我以为字典做不到呢?
PS:我是这样添加它们的:
string strText1 = "text";
SHA1 sha1_1 = new SHA1CryptoServiceProvider();
byte[] bytesHash1 = sha1_1.ComputeHash(System.Text.Encoding.UTF8.GetBytes(strText1));
string strText2 = "text";
SHA1 sha1_2 = new SHA1CryptoServiceProvider();
byte[] bytesHash2 = sha1_2.ComputeHash(System.Text.Encoding.UTF8.GetBytes(strText2));
dic.Add(bytesHash1, 1);
dic.Add(bytesHash2, 2);
字典不能这样做(有重复的键)。
但是,您的字典没有有重复的键,因为比较器将把byte[]
视为引用,有效地使用指针而不是数组的内容。
如果您想使用byte[]
作为键,可能最简单的解决方案是提供您自己的比较类,该类检查内容而不是参考值,例如:
public class BaComp: IEqualityComparer<byte[]> {
public bool Equals (byte[] left, byte[] right) {
// Handle case where one or both is null (equal only if both are null).
if ((left == null) || (right == null))
return (left == right);
// Otherwise compare array sequences of two non-null array refs.
return left.SequenceEqual (right);
}
public int GetHashCode (byte[] key) {
// Complain bitterly if null reference.
if (key == null)
throw new ArgumentNullException ();
// Otherwise just sum bytes in array (one option, there are others).
int rc = 0;
foreach (byte b in key)
rc += b;
return rc;
}
}
然后像这样使用:
Dictionary<byte[], MyClass> dic = new Dictionary<byte[], MyClass> (new BaComp());
您需要使用以下构造函数(documentation)实例化您的字典:
IEqualityComparer<byte[]> myComparator = GetMyComparatorSomehow();
Dictionary<byte[], MyClass> dic = new Dictionary<byte[], MyClass>(myComparator);
您的比较器应该按照这里的文档工作。