C#对象作为字典关键问题

时间:2010-08-23 06:43:49

标签: c# dictionary

请比较这两个代码。我无法理解为什么前者不能正常工作而后者完美无缺。

// With loop - not work
for (int i = 0; i < 5; i++)
{
    Location l = new Location();
    l.Identifier = i.ToString();
    _locations.Add(l);
}
////

Dictionary<Location, Route> _paths = new Dictionary<Location, Route>();
foreach (Location loc in _locations)
{
    _paths.Add(loc, new Route(loc.Identifier));
}

Location start = new Location();
start.Identifier = "1";
_paths[start].Cost = 0;       //raised Key not exists error

这是工作版......

// Without Loop - it work
Location l1 = new Location();
l1.Identifier = "1";
_locations.Add(l1);

Location l2 = new Location();
l2.Identifier = "2";
_locations.Add(l2);

Location l3 = new Location();
l3.Identifier = "3";
_locations.Add(l3);
/////

Dictionary<Location, Route> _paths = new Dictionary<Location, Route>();
foreach (Location loc in _locations)
{
    _paths.Add(loc, new Route(loc.Identifier));
}

Location start = new Location();
start.Identifier = "1";
_paths[start].Cost = 0;

有什么想法吗?感谢。

修改:位置等级

public class Location

{
    string _identifier;
    public Location()
    {

    }

    public string Identifier
    {
        get { return this._identifier; }
        set { this._identifier=value; }
    }

    public override string ToString()
    {
        return _identifier;
    }
}

4 个答案:

答案 0 :(得分:3)

除非您覆盖Equals类中的GetHashCodeLocation,以便Dictionary根据其标识符的相等性匹配Location个关键对象,否则不应该有效而不是对象平等。

答案 1 :(得分:0)

Location类是否实现了GetHashCode?如果没有,您应该覆盖它并确保它为每个实例返回一个唯一的int。

答案 2 :(得分:0)

除了GetHashCode之外,您还需要在报告哈希码相等时调用Equals,以结束对象的相等性。在隔离中,哈希码只能证明不等式。不相等的对象可以具有相同的哈希码;相等的哈希码不能证明对象是相等的。

答案 3 :(得分:-1)

您提到的两个代码都不起作用。尝试再次运行代码标记为“工作版本”,它应该抛出与第一个相同的异常。