我有一個Dictionary
其中鍵和值都是字符串。可以通過使用[]
來獲取密鑰的值。但[]
需要一個字符串。是否有可能通過使用數字而不是String鍵來獲取鍵的值?檢索字典項編號
Dictionary<String, String> m_GermanEnglish = new Dictionary<String, String>();
m_GermanEnglish.Add("der", "the");
我有一個Dictionary
其中鍵和值都是字符串。可以通過使用[]
來獲取密鑰的值。但[]
需要一個字符串。是否有可能通過使用數字而不是String鍵來獲取鍵的值?檢索字典項編號
Dictionary<String, String> m_GermanEnglish = new Dictionary<String, String>();
m_GermanEnglish.Add("der", "the");
您可以使用LINQ
m_GermanEnglish.ElementAt(index);
但你是依靠的實現,你不知道或保證。詞典不保證元素按特定順序排列。
+1雖然這可能會永遠有效,但是沒有什麼能夠阻止實現在未來發生變化,並導致使用它的代碼以可怕的方式破解。你被警告了。 –
你不能索引到字典按序號作爲項目不具備明顯感覺到一個序,它只是暴露了關鍵字作爲索引。字典也不保證順序。添加一個密鑰或刪除一個密鑰,它是不確定其中該密鑰將根據「內存位置」登陸。
如果你想通過序號索引得到東西,那麼我猜你需要一個不同的集合,而不是Dictionary<>
。可能是List<Tuple<string, string>>
?顯然這不會給予任何重複的支持,但它可以讓你將項目配對並給你一個索引。
在System.Linq的命名空間中的擴展功能,可以做到以下幾點:
var indexedDictionary = m_GermanEnglish.ToArray();
var pairAt0 = indexedDictionary[0];
您也可以使用.ToList
extenstion功能,而不是.ToArray
。他們都返回一組KeyValuePair<TKey, TValue>
對象。
注:在字典中的條目不一定以相同的順序,因爲他們投入的順序進行排序
如果你需要保持一定的順序,以您的鍵/值對在您的字典,您最好使用SortedDictionary或SortedList。在我的測試中,SortedList在按鍵查找和索引時傾向於快兩倍,但SortedDictionary在刪除條目時速度快了約100倍。
這並不理想,因爲您不知道如何安排結果數組,並且安排它將需要額外(相對較慢)的調用。 – tmesser
我只記得這一點,並確保它被包含在答案中。 –
IDictionary
接口在枚舉字典時不保證項目的順序,字典本身是無序的。因此,不存在'位置1的項目',因爲集合是無序的。
每次列舉字典時,這些項目以不同的順序出現是有效的。
如果您還需要通過索引訪問項目,那麼您需要一個不同的數據結構,如IOrderedDictionary
實現。有一個here基本上與字典保持一個列表並提供索引訪問。
字典中的項目順序未定義:http://msdn.microsoft.com/en-us/library/ekcfxy3x.aspx也就是說,值集合的順序只能保證與順序相同,但Dictionary保留更改它們的權利。
其他選項: 你可以看看老NameObjectCollection - 它你的要求,但它早仿製藥,所以它只是一個對象字典(如果你使用反射器來查看NameObjectCollection,你會看到他們做了同樣的事情 - 他們真的實現了2個集合,一個HashTable和一個List)。
你可以將它們只存儲在一個列表中,並使用LINQ進行搜索,但這是一個很好的解決方案,取決於你需要存儲多少項目(字典查找是O(1),列表搜索將是O (n)最好
你爲什麼想要這樣做?感覺就像你必須做錯某些事情,如果你有一個索引你想變成一個值... –