Comment obtenir la clé du dictionnaire en utilisant la valeur du dictionnaire?
quand on obtient la valeur en utilisant la clé, c'est comme ça:
Dictionary<int, string> dic = new Dictionary<int, string>();
dic.Add(1, "a");
Console.WriteLine(dic[1]);
Console.ReadLine();
Comment faire le contraire?
Un dictionnaire est vraiment destiné à une recherche à sens unique à partir de Key-> Value.
Vous pouvez faire le contraire en utilisant LINQ:
var keysWithMatchingValues = dic.Where(p => p.Value == "a").Select(p => p.Key);
foreach(var key in keysWithMatchingValues)
Console.WriteLine(key);
Réalisez qu'il peut y avoir plusieurs clés avec la même valeur, donc toute recherche appropriée retournera une collection de clés (c'est pourquoi la foreach existe ci-dessus).
Force brute.
int key = dic.Where(kvp => kvp.Value == "a").Select(kvp => kvp.Key).FirstOrDefault();
Vous pouvez également utiliser la méthode d’extension suivante pour obtenir la clé du dictionnaire par valeur
public static class Extensions { public static bool TryGetKey<K, V>(this IDictionary<K, V> instance, V value, out K key) { foreach (var entry in instance) { if (!entry.Value.Equals(value)) { continue; } key = entry.Key; return true; } key = default(K); return false; } }
l'utilisation est aussi simple
int key = 0;
if (myDictionary.TryGetKey("Twitter", out key))
{
// successfully got the key :)
}
moyen facile d'obtenir une clé:
public static TKey GetKey<TKey,TValue>(Dictionary<TKey, TValue> dictionary, TValue Value)
{
List<TKey> KeyList = new List<TKey>(dictionary.Keys);
foreach (TKey key in KeyList)
if (dictionary[key].Equals(Value))
return key;
throw new KeyNotFoundException();
}
et pour les clés multiples:
public static TKey[] GetKeys<TKey, TValue>(Dictionary<TKey, TValue> dictionary, TValue Value)
{
List<TKey> KeyList = new List<TKey>(dictionary.Keys);
List<TKey> FoundKeys = new List<TKey>();
foreach (TKey key in KeyList)
if (dictionary[key].Equals(Value))
FoundKeys.Add(key);
if (FoundKeys.Count > 0)
return FoundKeys.ToArray();
throw new KeyNotFoundException();
}
Je réalise que c’est une vieille question, mais je voulais ajouter quelque chose auquel je pensais.
Si vous savez qu'il n'y aura qu'une clé pour une valeur et que vous devrez chercher via valeur ainsi que clé; vous pouvez créer deux dictionnaires distincts. Un avec la clé d'origine en tant que clé et la valeur en tant que valeur et le second avec la clé en tant que valeur et la valeur en tant que clé.
Maintenant, une note de côté à ce sujet; cela utilise plus de ressources de la machine, mais j'imagine que c'est plus rapide que le forçage brutal via LINQ et foreach.