C # coordinar diccionario con llave
-
11-10-2019 - |
Pregunta
Tengo un Room
clase, y una World
clase. Actualmente, tengo un
Dictionary<Point, Room> world;
, que almaceno Room
s de este modo:
world.Add(new Point(0,0), new Room());
Pero cuando trato de acceder a él, se devuelve un valor nulo:
world.Get(new Point(0,0));
Yo entiendo la razón por la que esto está sucediendo. Pero mi pregunta es:? ¿Alguien sabe una mejor manera de hacer esto
Solución
Esto debería funcionar bien, siempre y cuando su Point
implementos de implementación GetHashCode
y Equals
correctamente.
Por ejemplo, la siguiente funciona perfectamente:
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();
}
}
Esto es usando System.Drawing.Point, que implementa GetHashCode
correctamente. (Se imprime "2", como se esperaba.)
Sospecho que el problema es su aplicación de Point
. Asegúrese de que se implementa Equals
y GetHashCode
correctamente, o (mejor aún) utilizan una versión del punto incluido en el marco.
Otros consejos
Puede proporcionar su propia IEqualityComparer cuando se ejemplariza el diccionario:
public Dictionary(IEqualityComparer<TKey> comparer)
Esto funciona incluso si no se puede modificar la clase TKey originales.