2011-01-15 5 views
1

J'ai une classe Room et une classe World. À l'heure actuelle, j'aiDictionnaire de coordonnées à coordonnées C#

Dictionary<Point, Room> world; 

que je stocke Room s dans comme ceci:

world.Add(new Point(0,0), new Room()); 

Mais lorsque je tente d'y accéder, il renvoie NULL:

world.Get(new Point(0,0)); 

Je comprends la raison pour laquelle cela se passe. Mais ma question est la suivante: quelqu'un connaît-il une meilleure façon de faire cela?

+0

Quelle est la raison pour laquelle vous utilisez un dictionnaire <>? –

+0

vs un tableau? Je fais ceci pour un jeu basé sur le texte qui contient des «salles», et si vous allez dans une pièce qui n'est pas résistante, elle vous laisse créer la pièce. Ce serait une douleur dans le cou d'utiliser un tableau, avec tout le redimensionnement et d'autres choses, alors je suis allé avec un dictionnaire – Entity

+0

Est-ce que "Point" votre classe? Si non, quelle classe/structure "Point" utilisez-vous? –

Répondre

7

Cela devrait fonctionner correctement, à condition que votre implémentation Point implémente correctement GetHashCode et Equals.

Par exemple, les travaux suivants: 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(); 
    } 
} 

est d'utiliser System.Drawing.Point, qui met en œuvre GetHashCode correctement. (Il imprime "2", comme prévu.)

Je soupçonne que le problème est votre implémentation de Point. Assurez-vous qu'il implémente correctement Equals et GetHashCode, ou (mieux encore) utilisez une version de Point incluse dans le framework.

+0

L'utilisation de 'System.Windows.Point' à la place de ma propre classe fonctionnait parfaitement. Merci! – Entity

+2

@TheAdamGaskins: Le problème est qu'une classe/struct doit implémenter Equals + GetHashCode correctement si vous voulez l'utiliser comme une clé dans un dictionnaire ... –

1

Vous pouvez provide your own 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.

+1

cela signifie-t-il que le dictionnaire fonctionnera dans O (n), car il est pas plus de hachage? –

Questions connexes