开发者

C# Object as Dictionary Key Problem

开发者 https://www.devze.com 2023-01-12 11:54 出处:网络
Please compare these two codes. I can\'t understand why former one didn\'t work while latter one work perfectly.

Please compare these two codes. I can't understand why former one didn't work while latter one work perfectly.

// 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

Here is working version...

// 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;

Any ideas? Thanks.

Edit: Location Class

public class Location

{
    string _identifier;
    public Location()
    {

    }

    public string Identifier
    {
        get { return this._identifier; }
        set { this._identifier=v开发者_如何学Calue; }
    }

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


Neither should work unless you override Equals and GetHashCode in your Location class so that the Dictionary matches Location key objects based on equality of their Identifier rather than object equality.


Does the Location class implement GetHashCode? If not, you should override this and make sure it returns a unique int for each instance.


In addition to GetHashCode you need to override Equals as it is called when hash codes are reported equal, to conclude the objects equality. In isolation hash codes can only prove inequality. Non-equal objects can have equal hash codes; equal hash codes do not prove objects are equal.


Both the code pieces you have mentioned will not work. Try running your code tagged "Working version" again, it should throw the same exception as the first one.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号