433 votes

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 ça :

getByValueKey(string value);

getByValueKey("one") doit être retourné "1" .

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

10 votes

0 votes

J'ai lu cet article avant, mais la réponse est là.

6 votes

Oui, mais là vous avez une réponse acceptée de Skeet .

757voto

Kimi Points 3652

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, créez un dictionnaire inverse où les valeurs sont des clés et les clés des valeurs.

0 votes

Mes valeurs ne sont pas publiées. votre idée est donc bonne pour moi. merci.

4 votes

@loviji : Gardez à l'esprit que dans la solution de bouclage, si la valeur se trouve à la fin du dictionnaire, il faudra passer en revue toutes les autres valeurs pour la trouver. Si vous avez un certain nombre d'entrées, cela ralentira votre programme.

2 votes

@Zach Johnson : Merci. je suis d'accord avec vous. et votre réponse me plaît aussi. mais dans mon dictionnaire 8-10 entrées. et ils ne sont pas ajoutés dynamiquement. et je pense, en utilisant cette réponse pas mauvaise solution.

30voto

Zach Johnson Points 12062

Tu pourrais le faire :

  1. En parcourant en boucle toutes les KeyValuePair<TKey, TValue> dans le 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 occuperait deux fois plus d'espace en mémoire).

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

De même, toutes les clés doivent être uniques, mais les valeurs ne sont pas tenues d'être uniques. Vous pouvez avoir plus d'une clé avec la valeur spécifiée.

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

1 votes

Pour créer le dictionnaire inverse de manière programmatique, nous devrions toujours utiliser la méthode 1, n'est-ce pas ?

0 votes

Si cela est courant, je recommanderais également cet échange (en ce qui concerne votre dernière question).

10voto

Benoit Points 39210

Que faire si la valeur existe pour plus d'une clé ?

Quelle clé doit être retournée ?

Afin d'éviter de faire des suppositions, Microsoft n'a pas inclus un fichier GetKey méthode.

6voto

Boris Zinchenko Points 31

Je me suis trouvé dans une situation où la liaison Linq n'était pas disponible et j'ai dû développer lambda explicitement. Cela a donné une fonction simple :

public static T KeyByValue<T, W>(this Dictionary<T, W> dict, W val)
{
    T key = default;
    foreach (KeyValuePair<T, W> pair in dict)
    {
        if (EqualityComparer<W>.Default.Equals(pair.Value, val))
        {
            key = pair.Key;
            break;
        }
    }
    return key;
}

Appelez ça comme suit :

public static void Main()
{
    Dictionary<string, string> dict = new Dictionary<string, string>()
    {
        {"1", "one"},
        {"2", "two"},
        {"3", "three"}
    };

    string key = KeyByValue(dict, "two");       
    Console.WriteLine("Key: " + key);
}

Fonctionne sur .NET 2.0 et dans d'autres environnements limités.

1voto

Josh McGee Points 52
public static string GetKeyFromValue(string valueVar)
{
   foreach (string keyVar in dictionaryVar.Keys) 
   { 
      if (dictionaryVar[keyVar] == valueVar)
      {
         return keyVar;
      }
   }
   return null;
}

d'autres personnes ont peut-être des réponses plus efficaces, mais je trouve personnellement que celle-ci est plus intuitive et qu'elle fonctionne dans mon cas, alors je la partage au cas où d'autres personnes seraient d'accord.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X