我有一个词典有5个不同的双打在列表中。我知道列表中每个项目的顺序。我试图找到一行代码,我可以在列表中查找列表中给定密钥的特定值。列表<double>字典查找特定项目的价值
因此,像:
double myDbl = myDict["key"][value[3]];
是这样的可能,我不能在任何地方找到它。由于
我有一个词典有5个不同的双打在列表中。我知道列表中每个项目的顺序。我试图找到一行代码,我可以在列表中查找列表中给定密钥的特定值。列表<double>字典查找特定项目的价值
因此,像:
double myDbl = myDict["key"][value[3]];
是这样的可能,我不能在任何地方找到它。由于
正如其他人所说,如果这是一个Dictionary<string, List<double>>
你可能只是使用
double value = myDict["key"][3];
然而,这条线:
我知道在列表中每个项目的顺序。
让我觉得实际上你应该重构你的代码。如果你知道第一个项目总是代表一个数据(例如重量),下一个总是代表另一个(例如高度)等,那么你应该创建一个具有这些属性的新类型。为此,使用List<double>
会使代码难以维护......它并不自然地显示有关每个值的含义的信息。
一旦你把它改成,比方说,一个Dictionary<string, Person>
你可以使用:
double height = myDict["key"].Height;
这是显著更清晰。
当然,这是可能的,你的意思是由我所引用的行别的东西......
+1为切断这个问题的幽灵到兽的心脏。 (也许) – JDB
假设你有一个字典定义为
Dictionary<string,List<double>>
,并假设该词典元素初始化正确,您可以执行以下操作:
myDbl = myDict["key"][3];
这也许应该是这样的:
double myDbl = myDict["key"][3];
正如您在寻找索引3从结果列表从t他key
通过了解操作员执行的顺序,您可以看到myDict["key"]
将返回您的值类型,此处假定为List<double>
。从这个返回值开始,你想要得到第四个对象(基于0),所以你最后使用[3]
。
考虑:
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];
如果您收藏看起来是这样的:
Dictionary<string,List<double>> myDictionary;
然后下面的工作:
double myDouble = myDictionary["key"][3];
创建一个像这样的方法,可以返回您的值,不管您通过哪个键。
private double GetValue(Dictionary<string, double> dict, string key)
{
return (from pair in dict where pair.Key == key select pair.Value).FirstOrDefault();
}
请记住,这是一个使用LINQ,仅可使用.Net框架工作3.5
为什么要将O(1)操作变成O(n)操作?使用TryGetValue可以更有效地实现相同的结果。哦,LINQ不需要.NET 4.0 - 它是在3.5中引入的。 –
@JonSkeet因为像这样做是更好的做法,代码是在同一个地方。 LINQ在3.5是我的错误。 –
这绝对不是*更好的做法。我希望我能多次downvote。你有一个字典,它是按键查找的最佳选择:如果你想要做的只是获取与一个键相关的值,你应该*不*遍历所有的条目。请注意,你甚至还没有解决这个问题 - 这是公认的不清楚 - 价值不是“双”,而是“列表
声明该词典的词典<字符串,列表>? –
Alex
你现在的问题很不清楚。我们几乎不知道你的字典是如何声明的,或者你的实验结果如何。 –
问题解决了,只需要一个[3],而不是寻找字典的值属性 – Ron