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 Rooms 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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top