Как выбрать несколько значений из Словака с помощью Linq как можно проще
Мне нужно выбрать несколько значений (в список) из Словаря на основе подмножества клавиш.
Я пытаюсь сделать это в одной строке кода, используя Linq, но то, что я нашел до сих пор, кажется довольно длинным и неуклюжим. Какой был бы самый короткий (самый чистый) способ сделать это?
Это то, что у меня есть сейчас (ключи - это строки и ключиToSelect - это список выбранных ключей):
List<ValueType> selectedValues = dictionary1.Where(x => keysToSelect.Contains(x.Key))
.ToDictionary<String, valueType>(x => x.Key,
x => x.Value)
.Values.ToList;
Спасибо.
Ответы
Ответ 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();