我有一個詞典有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