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

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

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

Мне нужно что-то вроде этого:

getByValueKey(string value);

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

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

Комментарии к вопросу (5)
Решение

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

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

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

Комментарии (13)

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

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

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

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

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

Комментарии (2)

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

С# публичных KeyByValue статические Т<т ш>(словарь<т ш> дикт, Вт вал) { Т ключ = по умолчанию; KeyValuePair цикл foreach (<Т, П> пара в дикт) { если (EqualityComparer<Б>.По умолчанию.Равна(пара.Значение, Вэл)) { ключ = пара.Ключ; перерыв; } } вернуть ключ; }

Называйте это как следующее:

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 и в других ограниченных средах.

Комментарии (1)

Я создал двойной подстановки класса:


/// 
/// dictionary with double key lookup
/// 
/// primary key
Комментарии (0)

может, что-то вроде этого:

foreach (var keyvaluepair in dict)
{
    if(Object.ReferenceEquals(keyvaluepair.Value, searchedObject))
    {
        //dict.Remove(keyvaluepair.Key);
        break;
    }
}
Комментарии (0)
types.Values.ToList().IndexOf("one");

Значения.Список() преобразует значения словарь в список объектов. Метод indexOf("один и") ищет свой новый список, ищу "один" и возвращает индекс которого соответствует индексу пара ключ/значение в словаре.

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

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

Комментарии (0)

Ниже код работает, только если он содержит уникальные данные, стоимость

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[ValueIndex];

    }
    return string.Empty;
}
Комментарии (2)

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

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[rLine];
    Console.WriteLine("Value for " + rLine + " is" + value_For_Key);
}
Комментарии (3)