2010-03-18 8 views
3

Je voudrais savoir s'il est possible de récupérer un élément d'une hashtable en utilisant une clé identique à la clé actuelle, mais un objet différent. Je comprends pourquoi ce n'est probablement pas possible, mais j'aimerais voir s'il y a une façon compliquée de le faire. Mon problème vient du fait que, étant aussi bête que moi, j'ai créé des tables de hachage avec int [] comme clés, avec les tableaux entiers contenant des indices représentant la position spatiale. Je savais d'une manière ou d'une autre que je devais créer un nouvel int [] chaque fois que je voulais ajouter une nouvelle entrée, mais je ne pensais pas que lorsque je générerais des tableaux de coordonnées spatiales plus tard, ils récupéreraient les valeurs de mes hashtables. Maintenant j'essaye de décider si réarranger des choses pour que je puisse stocker mes valeurs dans ArrayLists, ou si rechercher par la liste des clefs dans la table de hachage pour celle que j'ai besoin chaque fois que je veux obtenir une valeur, aucune des options étant très cool.récupère la valeur de la hashtable avec le clone de la clé; C#

À moins bien sûr que // 1 fonctionne comme // 2!

Merci d'avance.

static void Main(string[] args) 
     { 
      Hashtable dog = new Hashtable(); 

      //1 
      int[] man = new int[] { 5 }; 
      dog.Add(man, "hello"); 
      int[] cat = new int[] { 5 }; 
      Console.WriteLine(dog.ContainsKey(cat)); //false 


      //2 
      int boy = 5; 
      dog.Add(boy, "wtf"); 
      int kitten = 5; 
      Console.WriteLine(dog.ContainsKey(kitten)); //true; 


     } 
+0

Il semble qu'il y ait un problème avec votre design ... –

+0

@Hamish Grubijan, pourquoi diriez-vous cela? Quel est le problème avec la recherche d'une valeur dans un 'Hashtable' lorsque vous utilisez une instance de clé nouvellement créée mais par ailleurs égale? Ceci est un scénario commun et est très bien supporté dans .NET. –

+1

@Sam, le problème avec la conception utilise une clé qui ne fournit pas de sémantique d'égalité des valeurs. Une clé idéale pour une hashtable serait 1) être immuable 2) override égal et 3) override gethashcode. Les tableaux ne répondent à aucun de ces critères. – Josh

Répondre

8

Oui, vous avez deux options.

  1. Mettre en œuvre Equals() et GetHashCode() dans les classes clés. Créez un IEqualityComparer personnalisé et transmettez-le au constructeur Hashtable.

Vous souhaitez implémenter Equals() et GetHashCode() vous-même lorsque les implémentations de sens pour tous les usages de votre classe personnalisée. S'ils ne sont appropriés que de temps en temps, alors utilisez un IEqualityComparer personnalisé qui a la même fonctionnalité mais qui le fournit séparément de la classe elle-même. Cette deuxième option vous permet également de fournir des règles personnalisées pour les classes de clés non personnalisées.

+0

+1 pour l'option 2 (puisqu'il ne peut pas très bien hériter de 'int []') –

+0

Un autre +1 pour l'option 2. Bien que je vous recommande fortement de changer la conception de l'application pour utiliser une clé plus appropriée. – Josh

Questions connexes