Как получить из словаря ключи, значения которых совпадают, средствами linq
Мне нужно вернуть Ключи словаря, с одинаковыми values, средствами linq.
Я понимаю принцип работы написанного запроса так: Из списка ключей -> взять список значений таких ключей из словаря -> добавить в коллекцию те ключи, значения которых удовлетворяют условию. В чем ошибка?
private Dictionary<string, string> clientsBase = new()
{
{ "[email protected]", "Алексей И.Г."},
{ "[email protected]", "Петрова М.Р"},
{ "[email protected]", "Иванов А.А" },
{ "[email protected]", "Иванов А.А" }
};
public string GetClientEmail(string name)
{
var fltEmails = clientsBase.Keys.Select(v => clientsBase[v])
.Where(n => n.Equals(name));
StringBuilder builder = new StringBuilder();
foreach (var fltEmail in fltEmails) builder.Append(fltEmail);
return builder.ToString();
}
Ответы (2 шт):
Автор решения: alexsteeel
→ Ссылка
Например, так:
public string GetClientEmail(string name)
{
var fltEmails = clientsBase
.Where(v => v.Value == name)
.Select(v => v.Key);
StringBuilder builder = new StringBuilder();
foreach (var fltEmail in fltEmails) builder.Append(fltEmail);
return builder.ToString();
}
В варианте из вопроса проблема в том, что сначала выбираются ключи, потом по ключам выбираются имена и уже эти имена фильтруются. А доступа к ключам на этом этапе уже нет.
Автор решения: Aarnihauta
→ Ссылка
Можно например так, но конечно способ @alexsteeel выглядит интуитивно понятнее
public string GetEmailsByName(Dictionary<string, string> items, string name)
{
var emails = items.GroupBy(x => x.Value == name)
.First(x => x.Key)
.Select(x => x.Key);
var sb = new StringBuilder();
foreach (var item in emails)
sb.Append(item);
return sb.ToString();
}