38

我需要根据键的子集从字典中选择多个值(到列表中)。

我正在尝试使用 Linq 在一行代码中执行此操作,但到目前为止我发现的内容似乎很长而且很笨拙。最短(最干净)的方法是什么?

这就是我现在拥有的(键是字符串,keysToSelect 是要选择的键列表):

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

谢谢你。

4

4 回答 4

70

那么你可以从列表而不是字典开始:

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

如果保证所有键都在字典中,则可以省略第一个Where

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

请注意,此解决方案比迭代字典更快,特别是如果要选择的键列表与字典的大小相比较小,因为Dictionary.ContainsKey它比List.Contains.

于 2012-09-22T15:16:01.520 回答
9

ADictionary<TKey,TValue>IEnumerable<KeyValuePair<TKey,TValue>>,所以你可以简单SelectValue属性:

 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()
于 2012-09-22T15:15:43.750 回答
3

如果您知道要选择的所有值都在字典中,则可以遍历键而不是遍历字典:

List<ValueType> selectedValues = keysToSelect.Select(k => dictionary1[k]).ToList();
于 2012-09-22T15:22:10.863 回答
0

从查找的角度来看,公认的解决方案仍然不是最有效的选择,因为您仍然必须检查键是否在字典中两次:一次用于过滤键,一次用于查找对象。

此解决方案没有该问题:

var selectedValues = keysToSelect
  .Select(_ => {
     var found = dict.TryGetValue(_, out TValue? result);
     return (found, result);
  })
  .Where(_ => _.found)
  .Select(_ => _.result!)
  .ToList();
于 2022-02-13T00:22:02.457 回答