C # coordinare dizionario a chiave
-
11-10-2019 - |
Domanda
Ho un Room
di classe, e un World
di classe. Attualmente, ho un
Dictionary<Point, Room> world;
che devo conservare Room
s in questo modo:
world.Add(new Point(0,0), new Room());
Ma quando cerco di accedervi, restituisce null:
world.Get(new Point(0,0));
capisco il motivo per cui questo sta accadendo. Ma la mia domanda è: Qualcuno sa un modo migliore di fare questo
Soluzione
Questo dovrebbe funzionare bene, a condizione che il Point
strumenti di implementazione e GetHashCode
Equals
correttamente.
Per esempio, il seguente funziona perfettamente:
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();
}
}
Questo è usare System.Drawing.Point, che implementa GetHashCode
correttamente. (Esso stampa "2", come previsto.)
Ho il sospetto che il problema è l'implementazione di Point
. Assicurarsi che implementa Equals
e GetHashCode
correttamente, o (meglio ancora) utilizzare una versione di Point inclusi nel quadro.
Altri suggerimenti
È possibile fornire il proprio IEqualityComparer quando si crea un'istanza del dizionario:
public Dictionary(IEqualityComparer<TKey> comparer)
Questo funziona anche se non è possibile modificare la classe TKey originale.