web-dev-qa-db-fra.com

Obtenir la clé du dictionnaire en utilisant la valeur du dictionnaire

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?

25
Rye

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).

62
Reed Copsey

Force brute.

        int key = dic.Where(kvp => kvp.Value == "a").Select(kvp => kvp.Key).FirstOrDefault();
21
John Gardner

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 :)
}
10
Zain Shaikh

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();
    }
2
TSnake41

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. 

0
Naate