Получить ключ, когда значение известно в словаре
У меня есть список словаря, и я ищу ключ на основе значения. Как это сделать?
"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();
}
Чтобы объяснить вышесказанное:
- Мы получаем все пары ключ-значение в словаре, которые имеют совпадающее значение, используя
Where
Линк функция. - Теперь, когда у нас есть
IEnumerable
изKeyValuePair
объекты, которые мы затем называемSelect
, которая является функцией linq, которая выполняет проекции. Это берет ключи из возвращенногоIEnumerable<KeyValuePair>
, - Наконец, мы конвертируем
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
так как нет индекса. Вместо этого вы должны вернуть ключ, который вы отправили в виде строки.