Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的字典包含两个键相同的条目?_C#_.net_Dictionary - Fatal编程技术网

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

C# 为什么我的字典包含两个键相同的条目?,c#,.net,dictionary,C#,.net,Dictionary,我创建了这样一本词典: Dictionary<byte[], MyClass> dic = new Dictionary<byte[], MyClass>(); 字典不能有重复的键 但是,您的字典没有重复的键,因为比较器将把byte[]作为引用,有效地使用指针而不是数组的内容 如果要使用byte[]作为键,最简单的解决方案可能是提供自己的比较类,用于检查内容而不是参考值,例如: public class BaComp: IEqualityComparer<byte

我创建了这样一本词典:

Dictionary<byte[], MyClass> dic = new Dictionary<byte[], MyClass>();
字典不能有重复的键

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

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

您需要使用


您的比较器应该按照文档说明的那样工作。

您需要使用


您的比较器应该按照文档记录的方式工作。

这两个条目是什么,它们是如何声明的?这两个条目是什么,它们是如何声明的?我更新了问题。那么,我如何添加它们而不是作为引用呢?您可以将它们转换为字符串,或者使用适当的IEqualityComparer来构造它。@οοο拞拞:对不起,我不确定我知道什么是IEqualityComparer。有人能更新代码并告诉我需要怎么做吗?如果它是空引用,为什么要抱怨呢?它不应该只是默默地处理它吗?容器的工作不是确保其内容物是合理的。只需为哈希代码返回0。对字节求和也是生成它的一种非常糟糕的方式,特别是因为字节数组实际上已经包含了一个哈希代码——这就是SHA1,一个加密哈希函数。只需使用前4个字节:返回键[0]|键[1]Ok。我取消投票是因为文档表明抛出异常是合法的,尽管它没有说你必须这样做。计算hashcode的方法基本上仍然很糟糕,以至于它颠覆了计算hashcode的整个过程。请注意,作为20d256的掷骰子问题,它的范围为0到5120,对于20字节的SHA1哈希,它的偏差为2560,并且通常是一个On操作,而不是O1。使用这样的哈希代码,您失去了字典的大部分恒定时间效率。我更新了问题。那么,我如何添加它们而不是作为引用呢?您可以将它们转换为字符串,或者使用适当的IEqualityComparer来构造它。@οοο拞拞:对不起,我不确定我知道什么是IEqualityComparer。有人能更新代码并告诉我需要怎么做吗?如果它是空引用,为什么要抱怨呢?它不应该只是默默地处理它吗?容器的工作不是确保其内容物是合理的。只需为哈希代码返回0。对字节求和也是生成它的一种非常糟糕的方式,特别是因为字节数组实际上已经包含了一个哈希代码——这就是SHA1,一个加密哈希函数。只需使用前4个字节:返回键[0]|键[1]Ok。我取消投票是因为文档表明抛出异常是合法的,尽管它没有说你必须这样做。计算hashcode的方法基本上仍然很糟糕,以至于它颠覆了计算hashcode的整个过程。请注意,作为20d256的掷骰子问题,它的范围为0到5120,对于20字节的SHA1哈希,它的偏差为2560,并且通常是一个On操作,而不是O1。使用这样的哈希代码,您失去了字典的大部分恒定时间效率。