字典允许我插入重复的键

本文关键字:允许我 插入 字典 | 更新日期: 2023-09-27 18:20:54

我创建了一些类,这样我就可以有一个字典,其中有一对作为密钥

public class RouteKey
{
    public Equip Equipment { get; set; }
    public Destiny Destiny { get; set; }
    public RouteKey() { }
    public RouteKey(Equip Equipment, Destiny Destiny) {
        this.Equipment = Equipment;
        this.Destiny = Destiny;
    }
}
public override bool Equals(object obj)
{
    if (obj == null) return false;
    if (this.GetType() != obj.GetType()) return false;
    RouteKey rk = (RouteKey)obj;
    // use this pattern to compare reference members
    if (!Object.Equals(Equipment, rk.Equipment)) return false;
    // use this pattern to compare value members
    if (!Destiny.Equals(rk.Destiny)) return false;
    return true;        
}
public class RouteValue
{
    public string Endpoint { get; set; }
    public bool Enabled { get; set; }
    public RouteValue() { }
    public RouteValue(string Endpoint, bool Enabled) {
        this.Endpoint = Endpoint;
        this.Enabled = Enabled;
    }
}
public Dictionary<RouteKey, RouteValue> Routes;

我的问题是,我能够在没有错误的情况下运行这些代码。。。

RouteKey rk1 = new RouteKey(Equip.SpaceShip, Destiny.sun);
RouteKey rk2 = new RouteKey(Equip.SpaceShip, Destiny.sun);
RouteKey rk3 = new RouteKey(Equip.Boat, Destiny.hell);
RouteValue rv1 = new RouteValue("rv1", true);
RouteValue rv2 = new RouteValue("rv2", false);
RouteValue rv3 = new RouteValue("rv3", true);
Routes.Add(rk1, rv1);
Routes.Add(rk3, rv3);
Routes.Add(rk2, rv2);

我曾尝试将equals方法添加到RouteKey类中,但在调试中,我可以看到代码从未通过该方法。

我该怎么办才能让字典按预期运行?

字典允许我插入重复的键

您的RouteKey需要重写GetHashCode()方法,使相等的RouteKey实例的哈希代码也相等(但不一定相反)。

您只覆盖了RoutKey类中的Equals()

您还应该覆盖GetHashCode()——这就是Dictionary将用于测试相等性的内容。

在重写Equals()GetHashCode()时,还应考虑重写==!=运算符。

我建议阅读MSDN上的Override Equals()和Operator==(C#编程指南)指南。

对于RouteKey类,您需要覆盖GetHashCode()方法:

http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx

你也可以检查这个SO问题:我们什么时候为字典执行GetHashCode()?