[英]How to select multiple values from a Dictionary using Linq as simple as possible
我需要 select 基于键子集的字典中的多个值(进入列表)。
我正在尝试使用 Linq 在一行代码中执行此操作,但到目前为止我发现的内容似乎很长而且很笨拙。 最短(最干净)的方法是什么?
这就是我现在拥有的(键是字符串,keysToSelect 是要选择的键列表):
List<ValueType> selectedValues = dictionary1.Where(x => keysToSelect.Contains(x.Key))
.ToDictionary<String, valueType>(x => x.Key,
x => x.Value)
.Values.ToList;
谢谢你。
那么你可以从列表而不是字典开始:
var selectedValues = keysToSelect.Where(dictionary1.ContainsKey)
.Select(x => dictionary1[x])
.ToList();
如果所有的按键都保证在词典中,你可以离开了第一个Where
:
var selectedValues = keysToSelect.Select(x => dictionary1[x]).ToList();
请注意,此解决方案比迭代字典更快,特别是如果要选择的键列表与字典的大小相比较小,因为Dictionary.ContainsKey
比List.Contains
快得多。
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()
如果您知道要选择的所有值都在字典中,则可以遍历键而不是循环遍历字典:
List<ValueType> selectedValues = keysToSelect.Select(k => dictionary1[k]).ToList();
从查找的角度来看,公认的解决方案仍然不是最有效的选择,因为您仍然必须检查该键是否在字典中两次:一次用于过滤键,一次用于查找 object。
此解决方案没有该问题:
var selectedValues = keysToSelect
.Select(_ => {
var found = dict.TryGetValue(_, out TValue? result);
return (found, result);
})
.Where(_ => _.found)
.Select(_ => _.result!)
.ToList();
当不能保证密钥存在时,接受的答案不是很有效 b/c 它执行两次查找。
根据接受的答案,我想出了这个扩展方法:
public static IEnumerable<TValue> GetMultiple<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, IEnumerable<TKey> keysToSelect)
{
foreach (var key in keysToSelect)
if (dictionary.TryGetValue(key, out TValue value))
yield return value;
}
不完全是“单线”,但我发现它比链接四个 Linq 方法更具可读性。
用法:
var results = dictionary.GetMultiple(keysToSelect).ToList()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.