Как получить из словаря ключи, значения которых совпадают, средствами 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();
}
→ Ссылка