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 que HashTable, SortedLists?
Les valeurs ne doivent pas nécessairement être uniques, vous devez donc effectuer une recherche. Vous pouvez faire quelque chose comme ça:
var myKey = types.FirstOrDefault(x => x.Value == "one").Key;
Si les valeurs sont uniques et insérées moins souvent que lues, créez un dictionnaire inverse où les valeurs sont clés et les clés sont des valeurs.
Tu pourrais faire ça:
KeyValuePair<TKey, TValue>
du dictionnaire (ce qui aura un impact considérable sur les performances si vous avez plusieurs entrées dans le dictionnaire)Utilisez la méthode 1 si les performances ne sont pas une considération, utilisez la méthode 2 si la mémoire n'est pas une considération.
De plus, toutes les clés doivent être uniques, mais les valeurs ne sont pas obligatoirement uniques. Vous pouvez avoir plusieurs clés avec la valeur spécifiée.
Y a-t-il une raison pour laquelle vous ne pouvez pas inverser la relation clé-valeur?
J'étais dans une situation où la liaison Linq n'était pas disponible et devait élargir lambda explicitement. Il en résulta une fonction simple:
public static T KeyByValue<T, W>(this Dictionary<T, W> dict, T 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 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.