Словарь запросов Linq, где значение в списке

У меня есть Dictionary<string, string> и еще List<string>. То, что я пытаюсь достичь, - это запрос linq, чтобы получить все элементы из словаря, где любые значения из указанного словаря находятся в List<string>.

Я нашел этот пост полезным, LINQ, запрашивающий словарь против списка. И смог написать следующее выражение linq, однако мои результаты никогда ничего не вернули.

Что я до сих пор.

Data - словарь, а PersonList - список строк.

var Persons = PersonList.Where(x => Data.ContainsKey(x))
                        .Select(z => new { key = z, value = Data[z] })
                        .ToList();

Ответ 1

Вы ищете ключи или значения? Если вы ищете значения, используйте

var Persons = Data.Where(kvp => PersonList.Contains(kvp.Value))
                  .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

Если вместо этого вам действительно нужны ключи, тогда ваш код должен работать, но другой вариант:

var Persons = Data.Where(kvp => PersonList.Contains(kvp.Key))
                  .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

Ответ 2

Попробуйте следующее:

var Persons = Data.Where(x=>PersonList.Contains(x.Value))
                  .Select(x=>new { key=x.Key, value=x.Value})
                  .ToList();

Я преобразовал результат в список, потому что заметил, что вы использовали его в своем коде. Если вы хотите, чтобы он был в словаре, просто взгляните на ответ, предоставленный D Stanley.

Ответ 3

Я думаю, что вам не нужно преобразовывать его в ToDictionary, потому что ваш источник - это словарь:

var Persons = Data.Where(kvp => personList.Contains(kvp.Key))
            .Select(x => x);

Я быстро протестировал его в LinqPad, но если это плохая идея или я ошибаюсь, оставьте комментарий.