C # verkeilten Wörterbuch koordinieren
-
11-10-2019 - |
Frage
Ich habe eine Klasse Room
, und eine Klasse World
. Derzeit habe ich eine
Dictionary<Point, Room> world;
, die ich speichere Room
s in etwa so:
world.Add(new Point(0,0), new Room());
Aber wenn ich versuche, darauf zuzugreifen, es gibt null zurück:
world.Get(new Point(0,0));
verstehe ich den Grund, warum dies geschieht. Aber meine Frage ist: Hat jemand wissen, einen besseren Weg, dies zu tun
Lösung
Das sollte funktionieren, sofern Ihre Point
Implementierung implementiert GetHashCode
und Equals
richtig.
Zum Beispiel folgendes funktioniert perfekt:
using System;
using System.Collections.Generic;
using System.Drawing;
class Room
{
public int X
{
get;
set;
}
}
struct Program
{
static void Main()
{
Dictionary<Point, Room> world = new Dictionary<Point, Room>();
world.Add(new Point(0, 0), new Room() { X = 0 });
world.Add(new Point(2, 3), new Room() { X = 2 });
Room room = world[new Point(2, 3)];
Console.WriteLine(room.X);
Console.ReadKey();
}
}
Dies ist mit System.Drawing.Point, die Geräte richtig GetHashCode
. (Es druckt "2" ist, wie erwartet.)
Ich vermute, das Problem ist die Implementierung von Point
. Stellen Sie sicher, dass es implementiert Equals
und GetHashCode
richtig, oder (noch besser) verwenden, um eine Version von Point enthielt im Rahmen.
Andere Tipps
Sie können geben Sie Ihre eigenen IEqualityComparer , wenn Sie das Wörterbuch instanziiert:
public Dictionary(IEqualityComparer<TKey> comparer)
Dies funktioniert auch, wenn Sie nicht die ursprüngliche TKey Klasse ändern können.