我需要根据一个键子集从一个字典中选择一些值(进入一个List)。
我正在尝试使用Linq在一行代码中执行此操作,但到目前为止我发现的内容似乎很长且很笨拙。什么是最短(最干净)的方法呢?
这就是我现在拥有的(键是字符串,keysToSelect是要选择的键列表):
List<ValueType> selectedValues = dictionary1.Where(x => keysToSelect.Contains(x.Key))
.ToDictionary<String, valueType>(x => x.Key,
x => x.Value)
.Values.ToList;
谢谢。
答案 0 :(得分:52)
你可以从列表而不是字典开始:
var selectedValues = keysToSelect.Where(dictionary1.ContainsKey)
.Select(x => dictionary1[x])
.ToList();
如果所有密钥都保证在字典中,您可以省略第一个Where
:
var selectedValues = keysToSelect.Select(x => dictionary1[x]).ToList();
请注意,此解决方案比迭代字典更快,特别是如果要选择的键列表与字典的大小相比较小,因为Dictionary.ContainsKey
比List.Contains
快得多。
答案 1 :(得分:7)
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()
答案 2 :(得分:3)
如果您知道要选择的所有值都在字典中,则可以遍历键而不是循环遍历字典:
List<ValueType> selectedValues = keysToSelect.Select(k => dictionary1[k]).ToList();