C # coordonnées dictionnaire clé
-
11-10-2019 - |
Question
J'ai un Room
de classe, et un World
de classe. À l'heure actuelle, j'ai
Dictionary<Point, Room> world;
que je stocke dans Room
s comme ceci:
world.Add(new Point(0,0), new Room());
Mais lorsque je tente d'y accéder, il retourne null:
world.Get(new Point(0,0));
Je comprends la raison pour laquelle ce qui se passe. Mais ma question est: Est-ce que quelqu'un sait une meilleure façon de le faire
La solution
Cela devrait fonctionner correctement, à condition que votre mise en œuvre Point
outils GetHashCode
et Equals
correctement.
Par exemple, ce qui suit fonctionne parfaitement:
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();
}
}
utilise System.Drawing.Point, qui met en œuvre GetHashCode
correctement. (Il imprime "2", comme prévu.)
Je suppose que le problème est votre implémentation de Point
. Assurez-vous qu'il implémente correctement Equals
et GetHashCode
ou (mieux encore) utiliser une version de pointe inclus dans le cadre.
Autres conseils
Vous pouvez fournir votre propre IEqualityComparer lorsque vous instancier le dictionnaire:
public Dictionary(IEqualityComparer<TKey> comparer)
Cela fonctionne même si vous ne pouvez pas modifier la classe TKey d'origine.