请比较这两个代码。我无法理解为什么前者不能正常工作而后者完美无缺。
// 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;
}
}
答案 0 :(得分:3)
除非您覆盖Equals
类中的GetHashCode
和Location
,以便Dictionary
根据其标识符的相等性匹配Location
个关键对象,否则不应该有效而不是对象平等。
答案 1 :(得分:0)
Location类是否实现了GetHashCode?如果没有,您应该覆盖它并确保它为每个实例返回一个唯一的int。
答案 2 :(得分:0)
除了GetHashCode之外,您还需要在报告哈希码相等时调用Equals,以结束对象的相等性。在隔离中,哈希码只能证明不等式。不相等的对象可以具有相同的哈希码;相等的哈希码不能证明对象是相等的。
答案 3 :(得分:-1)
您提到的两个代码都不起作用。尝试再次运行代码标记为“工作版本”,它应该抛出与第一个相同的异常。