Получить ключ словаря, используя значение словаря - PullRequest
25 голосов
/ 23 октября 2010

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

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

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

dic.Add(1, "a");

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

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

Ответы [ 5 ]

62 голосов
/ 23 октября 2010

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

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

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

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

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

21 голосов
/ 23 октября 2010

Грубая сила.

        int key = dic.Where(kvp => kvp.Value == "a").Select(kvp => kvp.Key).FirstOrDefault();
10 голосов
/ 23 октября 2010

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

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 :)
}
2 голосов
/ 29 июля 2015

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

    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();
    }
0 голосов
/ 05 декабря 2016

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...