Подтвердить что ты не робот

Как выбрать несколько значений из Словака с помощью Linq как можно проще

Мне нужно выбрать несколько значений (в список) из Словаря на основе подмножества клавиш.

Я пытаюсь сделать это в одной строке кода, используя Linq, но то, что я нашел до сих пор, кажется довольно длинным и неуклюжим. Какой был бы самый короткий (самый чистый) способ сделать это?

Это то, что у меня есть сейчас (ключи - это строки и ключиToSelect - это список выбранных ключей):

List<ValueType> selectedValues = dictionary1.Where(x => keysToSelect.Contains(x.Key))
                                            .ToDictionary<String, valueType>(x => x.Key,
                                                                             x => x.Value)
                                            .Values.ToList;

Спасибо.

4b9b3361

Ответ 1

Ну, вы можете начать с списка вместо словаря:

var selectedValues = keysToSelect.Where(dictionary1.ContainsKey)
                     .Select(x => dictionary1[x])
                     .ToList();

Если все ключи гарантированы в словаре, вы можете оставить первый Where:

var selectedValues = keysToSelect.Select(x => dictionary1[x]).ToList();

Обратите внимание, что это решение быстрее, чем итерация словаря, особенно если список клавиш для выбора мал по сравнению с размером словаря, потому что Dictionary.ContainsKey намного быстрее, чем List.Contains.

Ответ 2

A Dictionary<TKey,TValue> - IEnumerable<KeyValuePair<TKey,TValue>>, поэтому вы можете просто Select свойство Value:

 List<ValueType> selectedValues = dictionary1
           .Where(x => keysToSelect.Contains(x.Key))
           .Select(x => x.Value)
           .ToList();

или

 var selectValues = (from keyValuePair in dictionary1
                     where keysToSelect.Contains(keyValuePair.Key)
                     select keyValuePair.Value).ToList()

Ответ 3

Если вы знаете, что все значение, которое вы хотите выбрать, находится в словаре, вы можете прокручивать эти клавиши, а не прокручивать словарь:

List<ValueType> selectedValues = keysToSelect.Select(k => dictionary1[k]).ToList();