2009-05-15 9 views
2

J'utilise un StringDictionary pour stocker des paires de valeurs clés. Je dois utiliser les clés et les valeurs de manière interchangeable, c'est-à-dire que je devrais être capable d'obtenir la clé de la valeur, car dans mon cas, les valeurs seront distinctes.Obtenir la clé de la valeur dans la collection .Net

Y a-t-il un moyen direct de le faire (sans bouclage)? Ou s'il y a une autre collection que je pourrais utiliser pour y parvenir?

Actuellement, je suis Looping:

public String GetKeyFromValue(string value) 
     { 
      foreach (KeyValuePair<string, string> kvp in instance) 
      { 
       if (String.Equals(kvp.Value, value)) 
        return kvp.Key; 
      } 

      throw new Exception ("Key not found in FilterControlMapping"); 
     } 

Toute aide est très appréciée. Merci.

+0

Tags modifiés, car il n'est pas spécifique à asp.net –

+0

duplication possible de [Obtenir la clé de valeur d'un dictionnaire générique?] (Http://stackoverflow.com/questions/255341/getting-key-of- value-of-a-generic-dictionary) – nawfal

Répondre

2

La seule façon dont je peux penser à deux dictionnaires.

D1 < Key, Value> D2 < valeur clé>

Vous répéterez vos données bien. Mais vous pouvez rechercher les clés et les valeurs de cette façon.

0

Ce serait possible en utilisant aussi Dictionnaire:

Dictionary<string, string> sd = new Dictionary<string, string>(); 
string sKey = sd.Single(kvp => kvp.Value.Equals("A value")).Key; 

Notez que la méthode unique va jeter si la valeur se produit plus d'une fois. Vous pouvez utiliser First ou même FirstOrDefault.

Editer: Comme Jon Skeet a commenté que c'est encore en boucle. Les liens qu'il a publiés dans un dictionnaire lié fournissent la solution.

+0

Cela fait * effectivement * une boucle, c'est-à-dire que la complexité est O (n) au lieu de l'O (1) désirable. –

+0

Puis-je utiliser l'opérateur => dans la version 2.0? –

+0

Non, vous ne pouvez pas utiliser l'expression lambda. Voir http://stackoverflow.com/questions/556425/predicate-delegates-in-c sur la façon d'obtenir la même chose dans 2.0 Bien que vous remarquiez le commentaire de Jon Skeet. Cela sera toujours en boucle! – Onots

5

Vous devez essentiellement utiliser deux dictionnaires encapsulés dans un seul.

Il existe déjà des implémentations here et here dans d'autres questions de débordement de pile.

+0

Cela signifierait doubler la mémoire, n'est-ce pas? –

+0

Le souvenir de quoi exactement? Vous n'avez encore qu'une fois les * objets * réels (en supposant que nous parlons de types de référence), car chaque collection aurait juste des références aux valeurs réelles. Oui, l'espace requis pour la comptabilité, etc. serait doublé, mais c'est le prix à payer pour pouvoir regarder dans les deux sens. –

0

La meilleure idée est d'utiliser le dictionnaire au lieu de StringDictionary comme obselete .. vous pouvez en savoir plus sur ce ici: StringDictionary vs Dictionary<string, string> en ce qui concerne retrival vous devriez aller avec LINQ interne, il utilise des boucles, mais encore son chemin beaucoup plus propre ..

+0

Hey merci pour l'info. J'avais en fait migré du dictionnaire vers StringDictionary. Temps de revenir en arrière :) –

+0

vous êtes les bienvenus :) –

Questions connexes