【问题标题】:How to select multiple values from a Dictionary using Linq as simple as possible如何尽可能简单地使用 Linq 从字典中选择多个值
【发布时间】:2012-09-14 17:30:42
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

    标签: c# linq dictionary


    【解决方案1】:

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

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

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

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

    请注意,此解决方案比迭代字典更快,尤其是当要选择的键列表与字典的大小相比较小时,因为Dictionary.ContainsKeyList.Contains 快得多。

    【讨论】:

    • 如果保证键在字典中,那么这个答案是更好的答案(没有 Where)。
    • 太好了,这很优雅。谢谢。
    • 每次我重读这篇文章时 1) 我的头都要爆炸了,2) 我把各个部分粘在一起重新读一遍,3) 我想再次投票。
    【解决方案2】:

    Dictionary&lt;TKey,TValue&gt;IEnumerable&lt;KeyValuePair&lt;TKey,TValue&gt;&gt;,所以您可以简单地 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();
      

      【讨论】:

        猜你喜欢
        • 2010-12-03
        • 1970-01-01
        • 1970-01-01
        • 2018-01-06
        • 2020-06-15
        • 2023-03-03
        • 2019-06-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多