Получить ключ словаря, используя значение словаря
Как получить словарь с помощью значения словаря?
при получении значения с помощью ключа следующим образом:
Dictionary<int, string> dic = new Dictionary<int, string>();
dic.Add(1, "a");
Console.WriteLine(dic[1]);
Console.ReadLine();
Как сделать обратное?
Ответы
Ответ 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.