Domanda

Ho un Room di classe, e un World di classe. Attualmente, ho un

    Dictionary<Point, Room> world;

che devo conservare Rooms 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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top