obtenir une clé de dictionnaire par valeur

Comment obtenir une clé de dictionnaire par valeur en C# ?

Dictionary<string, string> types = new Dictionary<string, string>()
{
            {"1", "one"},
            {"2", "two"},
            {"3", "three"}
};

Je veux quelque chose comme ceci :

getByValueKey(string value);

getByValueKey("one&quot ;) doit retourner "1".

Quelle est la meilleure façon de faire cela ? Peut-être HashTable, SortedLists ?

Solution

Les valeurs ne doivent pas nécessairement être uniques, vous devez donc effectuer une recherche. Vous pouvez faire quelque chose comme ceci :

var myKey = types.FirstOrDefault(x => x.Value == "one").Key;

Si les valeurs sont uniques et sont insérées moins fréquemment que les lectures, alors créez un dictionnaire inverse où les valeurs sont des clés et les clés des valeurs.

Commentaires (13)

Tu pourrais le faire :

  1. En parcourant en boucle toutes les KeyValuePair's du dictionnaire (ce qui représente une perte de performance non négligeable si vous avez un certain nombre d'entrées dans le dictionnaire).
  2. Utiliser deux dictionnaires, l'un pour le mappage valeur-clé et l'autre pour le mappage clé-valeur (ce qui prendrait deux fois plus de place en mémoire).

Utilisez la méthode 1 si les performances ne sont pas un problème, utilisez la méthode 2 si la mémoire n'est pas un problème.

En outre, toutes les clés doivent être uniques, mais il n'est pas nécessaire que les valeurs soient uniques. Vous pouvez avoir plus d'une clé avec la valeur spécifiée.

Y a-t-il une raison pour laquelle vous ne pouvez pas inverser la relation clé-valeur ?

Commentaires (2)

J'ai un moyen très simple de le faire. Cela a parfaitement fonctionné pour moi.

Dictionary types = new Dictionary();

types.Add("1", "one");
types.Add("2", "two");
types.Add("3", "three");

Console.WriteLine("Please type a key to show its value: ");
string rLine = Console.ReadLine();

if(types.ContainsKey(rLine))
{
    string value_For_Key = types[rLine];
    Console.WriteLine("Value for " + rLine + " is" + value_For_Key);
}
Commentaires (3)