Pregunta

Tengo un Room clase, y una World clase. Actualmente, tengo un

    Dictionary<Point, Room> world;

, que almaceno Rooms 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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top