Подтвердить что ты не робот

Получить ключ словаря, используя значение словаря

Как получить словарь с помощью значения словаря?

при получении значения с помощью ключа следующим образом:

Dictionary<int, string> dic = new Dictionary<int, string>();

dic.Add(1, "a");

Console.WriteLine(dic[1]);
Console.ReadLine();

Как сделать обратное?

4b9b3361

Ответ 1

Словарь действительно предназначен для одностороннего поиска из Key- > Value.

Вы можете сделать обратное использование LINQ:

var keysWithMatchingValues = dic.Where(p => p.Value == "a").Select(p => p.Key);

foreach(var key in keysWithMatchingValues)
    Console.WriteLine(key);

Поймите, что могут быть несколько ключей с одинаковым значением, поэтому любой правильный поиск возвращает коллекцию ключей (вот почему foreach существует выше).

Ответ 2

Грубая сила.

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

Ответ 3

Вы также можете использовать следующий метод расширения, чтобы получить ключ от словаря по значению

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;
    }
}

использование также так просто

int key = 0;
if (myDictionary.TryGetKey("twitter", out key))
{
    // successfully got the key :)
}

Ответ 4

простой способ получить один ключ:

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

и для кратных ключей:

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

Ответ 5

Я понимаю, что это старый вопрос, но хотел добавить что-то, о чем я думал.

Если вы знаете, что будет только один ключ к одному значению, вам придется искать через значение, а также ключ; вы можете создать два отдельных словаря. Один с исходным ключом как ключ и значение как значение, а второй с ключом как значение и значение как ключ.

Теперь обратите внимание на это; он использует больше ресурсов для машины, но я предполагаю, что это быстрее, чем грубое форсирование через LINQ и foreach.