Dictionary получить ключ по значению.

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

Dictionary types = new Dictionary() { {"1", "one"}, {"2", "two"}, {"3", "three"} };

Я хочу что-то вроде этого:

GetByValueKey(string value);

getByValueKey("one") должен быть возвращен "1" .

Как лучше всего это сделать? Может быть, HashTable, SortedLists?

    Точная копия: stackoverflow.com/questions/255341 DIV>

    8 ответов 8

    Значения не обязательно должны быть уникальными, поэтому вам нужно выполнить поиск. Вы можете сделать что-то вроде этого:

    Var myKey = types.FirstOrDefault(x => x.Value == "one").Key;

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

    2016-05-25 15: 45: 20Z

    Вы можете сделать это:

    1. Перебирая все KeyValuePair в словаре (что будет значительным ударом по производительности, если у вас есть несколько записей в словаре)
    2. Используйте два словаря, один для отображения значения на ключ и один для отображения ключа на значение (которое занимало бы в два раза больше места в памяти).

    Используйте метод 1, если производительность не учитывается, используйте метод 2, если память не учитывается.

    Кроме того, все ключи должны быть уникальными, но значения не обязательно должны быть уникальными. У вас может быть несколько ключей с указанным значением.

    Есть ли причина, по которой вы не можете изменить отношение ключ-значение?

    2010-03-14 22: 35: 21Z

    Я попал в ситуацию, когда привязка Linq была недоступна, и пришлось явно расширять лямбду. Это привело к простой функции:

    Public static string KeyByValue(Dictionary dict, string val) { string key = null; foreach (KeyValuePair pair in dict) { if (pair.Value == val) { key = pair.Key; break; } } return key; }

    Назовите это следующим образом:

    Public static void Main() { Dictionary dict = new Dictionary() { {"1", "one"}, {"2", "two"}, {"3", "three"} }; string key = KeyByValue(dict, "two"); Console.WriteLine("Key: " + key); }

    Работает в.NET 2.0 и других ограниченных средах.

    2018-01-23 11: 01: 29Z

    может быть что-то вроде этого:

    Foreach (var keyvaluepair in dict) { if(Object.ReferenceEquals(keyvaluepair.Value, searchedObject)) { //dict.Remove(keyvaluepair.Key); break; } }

    2017-06-12 10: 58: 04Z

    Я создал класс двойного просмотра:

    ///

    /// dictionary with double key lookup /// /// primary key /// secondary key /// value type public class cDoubleKeyDictionary { private struct Key2ValuePair { internal T2 key2; internal TValue value; } private Dictionary d1 = new Dictionary(); private Dictionary d2 = new Dictionary(); /// /// add item /// not exacly like add, mote like Dictionary = overwriting existing values /// /// /// public void Add(T1 key1, T2 key2, TValue value) { lock (d1) { d1 = new Key2ValuePair { key2 = key2, value = value, }; d2 = key1; } } /// /// get key2 by key1 /// /// /// /// public bool TryGetValue(T1 key1, out TValue value) { if (d1.TryGetValue(key1, out Key2ValuePair kvp)) { value = kvp.value; return true; } else { value = default; return false; } } /// /// get key1 by key2 /// /// /// /// /// 2x O(1) operation /// /// public bool TryGetValue2(T2 key2, out TValue value) { if (d2.TryGetValue(key2, out T1 key1)) { return TryGetValue(key1, out value); } else { value = default; return false; } } /// /// get key1 by key2 /// /// /// /// /// 2x O(1) operation /// /// public bool TryGetKey1(T2 key2, out T1 key1) { return d2.TryGetValue(key2, out key1); } /// /// get key1 by key2 /// /// /// /// /// 2x O(1) operation /// /// public bool TryGetKey2(T1 key1, out T2 key2) { if (d1.TryGetValue(key1, out Key2ValuePair kvp1)) { key2 = kvp1.key2; return true; } else { key2 = default; return false; } } /// /// remove item by key 1 /// /// public void Remove(T1 key1) { lock (d1) { if (d1.TryGetValue(key1, out Key2ValuePair kvp)) { d1.Remove(key1); d2.Remove(kvp.key2); } } } /// /// remove item by key 2 /// /// public void Remove2(T2 key2) { lock (d1) { if (d2.TryGetValue(key2, out T1 key1)) { d1.Remove(key1); d2.Remove(key2); } } } /// /// clear all items /// public void Clear() { lock (d1) { d1.Clear(); d2.Clear(); } } /// /// /// public TValue this { get => d1.value; } /// /// enumerator on key1, so we can replace Dictionary by cDoubleKeyDictionary /// /// /// public TValue this { set { lock (d1) { d1 = new Key2ValuePair { key2 = key2, value = value, }; d2 = key1; } } }

    2019-02-26 18: 13: 01Z

    Код ниже работает только в том случае, если он содержит данные уникального значения

    Public string getKey(string Value) { if (dictionary.ContainsValue(Value)) { var ListValueData=new List(); var ListKeyData = new List(); var Values = dictionary.Values; var Keys = dictionary.Keys; foreach (var item in Values) { ListValueData.Add(item); } var ValueIndex = ListValueData.IndexOf(Value); foreach (var item in Keys) { ListKeyData.Add(item); } return ListKeyData; } return string.Empty; }

    2017-06-12 10: 59: 14Z

    Types.Values.ToList().IndexOf("one");

    Values.ToList () преобразует значения вашего словаря в список объектов. IndexOf ("один") ищет ваш новый список в поисках "один" и возвращает индекс, который будет соответствовать индексу ключа /Пара значений в словаре.

    Этот метод не заботится о ключах словаря, он просто возвращает индекс искомого значения.

    Помните, что в вашем словаре может быть несколько значений "один". И это причина, по которой нет метода «получить ключ».

    2015-09-11 23: 09: 34Z

    У меня есть очень простой способ сделать это. Это сработало идеально для меня.

    Dictionary types = new Dictionary(); types.Add("1", "one"); types.Add("2", "two"); types.Add("3", "three"); Console.WriteLine("Please type a key to show its value: "); string rLine = Console.ReadLine(); if(types.ContainsKey(rLine)) { string value_For_Key = types; Console.WriteLine("Value for " + rLine + " is" + value_For_Key); }

(PHP 4 >= 4.0.5, PHP 5)

array_search -- Осуществляет поиск данного значения в массиве и возвращает соответствующий ключ в случае удачи

Описание

mixed array_search (mixed needle, array haystack [, bool strict])

Ищет в haystack значение needle и возвращает ключ, если таковое присутствует в массиве, FALSE в противном случае.

Замечание: Если needle является строкой, производится регистро-зависимое сравнение.

Замечание: До PHP 4.2.0, array_search() при неудаче возвращала NULL вместо FALSE .

Если вы передадите значение TRUE в качестве необязательного третьего параметра strict , функция array_search() также проверит тип needle в массиве haystack .

Если needle присутствует в haystack более одного раза, будет возвращён первый найденный ключ. Для того, чтобы возвратить ключи для всех найденных значений, используйте функцию array_keys() с необязательным параметром search_value .


Пример 1. Пример использования array_search()

$array = array(0 => "blue" , 1 => "red" , 2 => 0x000000 , 3 => "green" , 4 => "red" );$key = array_search ("red" , $array ); // $key = 1;
$key = array_search ("green" , $array ); // $key = 2; (0x000000 == 0 == "green")
$key = array_search ("green" , $array , true ); // $key = 3;
?>
Внимание

Эта функция может возвращать как логическое значение FALSE , так и не относящееся к логическому типу значение, которое приводится к FALSE , например, 0 или "". За более подробной информации обратитесь к разделу Булев тип . Используйте оператор === для проверки значения, возвращаемого этой функцией.