为什么我的字典包含两个具有相同键的条目?

时间:2013-04-11 05:32:57

标签: c# .net dictionary

我创建了一个字典:

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);

2 个答案:

答案 0 :(得分:7)

字典不能这样做(有重复的密钥)。

但是,你的字典没有有重复的键,因为比较器会将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());

答案 1 :(得分:0)

您需要使用this constructor (documentation):

来实例化字典
IEqualityComparer<byte[]> myComparator = GetMyComparatorSomehow();
Dictionary<byte[], MyClass> dic = new Dictionary<byte[], MyClass>(myComparator);

您的比较器应按照记录的here工作。