【问题标题】:List<double> for value of dictionary lookup specific itemList<double> 用于字典查找特定项目的值
【发布时间】:2012-11-14 15:36:29
【问题描述】:

我有一个字典,列表中有 5 个不同的双打。我知道列表中每个项目的顺序。我正在尝试找到一个单行代码,我可以在给定键的情况下在列表中查找特定值。

比如:

double myDbl = myDict["key"][value[3]];

这样的可能吗,我在任何地方都找不到。谢谢

【问题讨论】:

  • 您是否将字典声明为 Dictionary> ?
  • 你现在的问题很不清楚。我们几乎不知道您的字典是如何声明的,或者您的实验结果如何。
  • 问题解决了,只需要一个 [3] 而不是查找字典的 value 属性
  • 为什么人们如此关心编写对代码的可读性或性能没有好处的单行代码?编写一个方法来检查该键是否存在于字典中,并为您获取该值。那么你猜怎么着:那个方法就是你的单线。

标签: c# list dictionary key-value


【解决方案1】:

正如其他人所说,如果这是Dictionary&lt;string, List&lt;double&gt;&gt;,您可以使用

double value = myDict["key"][3];

但是,这一行:

我知道列表中每个项目的顺序。

让我觉得实际上你应该重构你的代码。如果您知道第一项始终代表一个数据(例如体重),下一项始终代表另一个(例如身高)等,那么您应该使用这些属性创建一个新类型。为此使用List&lt;double&gt; 会使代码更难维护...它自然不会显示每个值的含义。

一旦您将其更改为 Dictionary&lt;string, Person&gt;,您就可以使用:

double height = myDict["key"].Height;

明显更清晰。

当然,我引用的那句话可能是你的意思……

【讨论】:

  • +1 用于将问题的阴暗面切入野兽的心脏。 (也许。)
【解决方案2】:

假设你有一个字典定义为

Dictionary<string,List<double>>

假设字典元素已正确初始化,您可以执行以下操作:

myDbl = myDict["key"][3];

【讨论】:

    【解决方案3】:

    应该是这样的:

    double myDbl = myDict["key"][3];
    

    当您从 key 的结果列表中寻找索引 3 时

    通过了解运算符的执行顺序,可以看到myDict["key"]会返回你的值类型,这里假设为List&lt;double&gt;。从这个返回值中,您想要获取第 4 个对象(基于 0),所以最后使用 [3]

    【讨论】:

      【解决方案4】:

      给定:

      Dictionary<string, List<double>> l_dict = new Dictionary<string, List<double>>();
      l_dict.Add( "key", new List<double>( new double[]{ 1, 2, 3, 4, 5 } );
      

      然后:

      List<double> l_valueCollection = l_dict["key"];
      double l_value = l_valueCollection[3];
      

      或者,更简洁(你想要的“单线”):

      double l_value = l_dict["key"][3];
      

      【讨论】:

      • 谢谢,我很接近了!我一直在尝试寻找属性“Value”,然后查找索引。那很简单。谢谢
      • @Ron - 另见 Jon Skeet 的回答。您可能会发现它更有帮助。不要忘记接受答案。
      【解决方案5】:

      如果你的收藏是这样的:

      Dictionary<string,List<double>> myDictionary;
      

      然后以下将起作用:

      double myDouble = myDictionary["key"][3];
      

      【讨论】:

        【解决方案6】:

        创建一个这样的方法来返回你的值,不管你传入什么键。

            private double GetValue(Dictionary<string, double> dict, string key)
            {
                return (from pair in dict where pair.Key == key select pair.Value).FirstOrDefault();
            }
        

        请记住,这是使用 LINQ,并且仅适用于 .Net Framework 3.5

        【讨论】:

        • 为什么要将 O(1) 操作转换为 O(n) 操作?使用 TryGetValue 将更有效地获得相同的结果。哦,LINQ 不需要 .NET 4.0 - 它是在 3.5 中引入的。
        • @JonSkeet 因为这样做是更好的做法,并且代码在同一个地方。是的,LINQ 在 3.5 中是我的错误。
        • 这绝对是不是更好的做法。我希望我可以多次否决。您有一个字典,它针对按键查找进行了优化:如果您只想获取与某个键关联的值,您应该 遍历所有条目。另请注意,您甚至还没有解决这个问题 - 诚然有些不清楚 - 值不是 double 而是 List&lt;double&gt;
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-29
        • 2020-02-16
        • 1970-01-01
        相关资源
        最近更新 更多