如何在字典中使用自定义的通用类型作为键?

23 浏览
0 Comments

如何在字典中使用自定义的通用类型作为键?

我想在字典中使用自定义的泛型类作为键。我应该如何重写EqualsGetHashCode方法?\n例如,\n

public class SomeKey
{
    public T Value1 { get; set; }
    public V Value2 { get; set; }
    public SomeKey(T val1, V val2)
    {
        this.Value1 = val1;
        this.Value2 = val2;
    }
    public override bool Equals(SomeKey otherKey)
    {
        //在这里选择什么是最佳选项?
    }
    public override int GetHashCode()
    {
        //在这里选择什么是最佳选项?
    }
}

\n谢谢

0
0 Comments

问题的原因是当我们想要在Dictionary中使用自定义的泛型类型作为键时,需要重写GetHashCode和Equals方法,以确保相同的对象始终返回相同的值。在这个问题中,我们需要根据对象的属性来计算哈希码,并确保相同的对象返回相同的哈希码和相等的结果。

解决方法是根据msdn上的建议,重写GetHashCode方法并实现Equals方法,以确保对象的哈希码和相等性是可靠的。下面是一个示例代码,演示了如何使用自定义的泛型类型作为Dictionary的键:

public class MyKey
{
    private T value;
    public MyKey(T value)
    {
        this.value = value;
    }
    public override int GetHashCode()
    {
        return value.GetHashCode();
    }
    public override bool Equals(object obj)
    {
        if (obj is MyKey)
        {
            MyKey other = (MyKey)obj;
            return value.Equals(other.value);
        }
        return false;
    }
}
public class Program
{
    public static void Main(string[] args)
    {
        Dictionary, string> myDictionary = new Dictionary, string>();
        MyKey key1 = new MyKey(1);
        MyKey key2 = new MyKey(2);
        myDictionary[key1] = "Value 1";
        myDictionary[key2] = "Value 2";
        Console.WriteLine(myDictionary[key1]); // Output: Value 1
        Console.WriteLine(myDictionary[key2]); // Output: Value 2
    }
}

通过重写GetHashCode和Equals方法,我们可以确保自定义的泛型类型可以作为Dictionary的键。这样,我们就可以使用自定义的类型来进行键值对的存储和检索了。

0
0 Comments

这段内容主要讨论了如何在Dictionary中使用自定义的泛型类型作为键,并提供了解决方法。问题的原因是需要重写Equals和GetHashCode方法来确保键的唯一性和正确性。

在解决方法中,作者首先使用Equals方法来比较Value1和Value2的相等性。然后,在GetHashCode方法中,作者使用异或(^)运算符来组合Value1和Value2的哈希码。

文章还提到,计算哈希码有很多替代的方法,如果性能是一个瓶颈,可以考虑使用更专门的方法。作者给出了一些关于如何计算哈希码的链接供读者参考。

关于为什么使用异或运算符的问题,作者解释说,选择最好的哈希码取决于值的分布情况。如果对值的分布情况一无所知,异或是一个相当可靠和简单的方法。如果OP有关于值分布的信息,那么可能需要选择其他的方法。这些只有在哈希码是性能瓶颈时才有影响。

此外,还提到了对于泛型类型定义,如果没有where约束来表示相等比较是可能的,那么使用==运算符是行不通的。作者通过使用Equals方法解决了这个问题。

最后,还有一个关于为什么使用&而不是&&的问题。作者解释说,使用&运算符是为了同时进行位运算,而不是逻辑运算。

这段内容提供了关于如何在Dictionary中使用自定义泛型类型作为键的解决方法,并讨论了相关问题和注意事项。

0