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

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

"someId" возвращает ошибку:

"Данный ключ отсутствует в словаре".

Поэтому, если я задаю значение "Ann", я ожидаю, что функция вернет ключ "30".

Каждый элемент в словаре выглядит следующим образом

    item 1
    [0] {[someid,30]}
    [1] {[somename,"Ann"]}
    [2] {[someaddress,"3, Carl House, UK"]}


private static int getmyId(string name)
{
    ...
    List<Dictionary<string, string>> myList = new List<Dictionary<string, string>>();

    foreach (Dictionary<string, string> item in myList)
    {           
        if (item.ContainsValue(name))
        {
              myID = item["Someid"];
        }
    }
    ...
    return myID
}

1 ответ

Получить ключ из значения в словаре немного сложно, потому что значения могут быть использованы повторно. Поэтому вам нужно либо вернуть список ключей, либо заставить функцию возвращать только первый соответствующий ключ.

Вот оба метода как статические функции:

static List<string> GetKeysFromValue(Dictionary<string,string> dict, string val)
{
    if(!dict.ContainsValue(val))
        return new List<string>(); //return EMPTY list for no matching keys

    return dict.Where(kv => kv.Value.Equals(val)).Select(kv => kv.Key).ToList();
}

Чтобы объяснить вышесказанное:

  1. Мы получаем все пары ключ-значение в словаре, которые имеют совпадающее значение, используя Where Линк функция.
  2. Теперь, когда у нас есть IEnumerable из KeyValuePair объекты, которые мы затем называем Select, которая является функцией linq, которая выполняет проекции. Это берет ключи из возвращенного IEnumerable<KeyValuePair>,
  3. Наконец, мы конвертируем IEnumerable<string> в список, позвонив .ToList()

Чтобы получить только первый соответствующий ключ, вы можете сделать это:

static string GetFirstKeyFromValue(Dictionary<string,string> dict, string val)
{
    if(!dict.ContainsValue(val))
        return null; //return null because nothing matched.

    return dict.FirstOrDefault(kv => kv.Value.Equals(val)).Key;
}

FirstOrDefault вернет первую соответствующую пару значений ключа из словаря, или null если ничего не найдено Так как мы уже проверили, что он вернет что-то ранее с ContainsValue() метод, мы можем безопасно просто позвонить Key чтобы получить значение ключевого свойства.

Я также хотел бы отметить, что на основе подписи вашего метода, которую вы опубликовали, вы лечите Dictionary<string,string> как List<string>, Словарь не имеет индексов, поэтому используется определяемый пользователем тип ключа. Поэтому нет причин возвращать int так как нет индекса. Вместо этого вы должны вернуть ключ, который вы отправили в виде строки.

Другие вопросы по тегам