2012-06-12 60 views
0

我有一個Dictionary其中鍵和值都是字符串。可以通過使用[]來獲取密鑰的值。但[]需要一個字符串。是否有可能通過使用數字而不是String鍵來獲取鍵的值?檢索字典項編號

Dictionary<String, String> m_GermanEnglish = new Dictionary<String, String>(); 
m_GermanEnglish.Add("der", "the"); 
+0

你爲什麼想要這樣做?感覺就像你必須做錯某些事情,如果你有一個索引你想變成一個值... –

回答

4

可以使用LINQ

m_GermanEnglish.ElementAt(index); 

但你是依靠的實現,你不知道或保證。詞典不保證元素按特定順序排列。

+1

+1雖然這可能會永遠有效,但是沒有什麼能夠阻止實現在未來發生變化,並導致使用它的代碼以可怕的方式破解。你被警告了。 –

3

你不能索引到字典按序號作爲項目不具備明顯感覺到一個序,它只是暴露了關鍵字作爲索引。字典也不保證順序。添加一個密鑰或刪除一個密鑰,它是不確定其中該密鑰將根據「內存位置」登陸。

如果你想通過序號索引得到東西,那麼我猜你需要一個不同的集合,而不是Dictionary<>。可能是List<Tuple<string, string>>?顯然這不會給予任何重複的支持,但它可以讓你將項目配對並給你一個索引。

+1

語義上,正確的。簡單地枚舉foreach中的字典以將其暴露爲一組'KeyValuePair <字符串,字符串>'元素。 – Tejs

+0

@Tejs確實,這涉及知道需要將項目索引出來的「原因」。 –

+0

@Tejs正確,但不能保證項目的輸入順序與輸入順序相同,所以索引到他們將是沒有意義的。 – SimpleVar

1

在System.Linq的命名空間中的擴展功能,可以做到以下幾點:

var indexedDictionary = m_GermanEnglish.ToArray(); 
var pairAt0 = indexedDictionary[0]; 

您也可以使用.ToList extenstion功能,而不是.ToArray。他們都返回一組KeyValuePair<TKey, TValue>對象。

注:在字典中的條目不一定以相同的順序,因爲他們投入的順序進行排序

如果你需要保持一定的順序,以您的鍵/值對在您的字典,您最好使用SortedDictionarySortedList。在我的測試中,SortedList在按鍵查找和索引時傾向於快兩倍,但SortedDictionary在刪除條目時速度快了約100倍。

+1

這並不理想,因爲您不知道如何安排結果數組,並且安排它將需要額外(相對較慢)的調用。 – tmesser

+0

我只記得這一點,並確保它被包含在答案中。 –

6

IDictionary接口在枚舉字典時不保證項目的順序,字典本身是無序的。因此,不存在'位置1的項目',因爲集合是無序的。

每次列舉字典時,這些項目以不同的順序出現是有效的。

如果您還需要通過索引訪問項目,那麼您需要一個不同的數據結構,如IOrderedDictionary實現。有一個here基本上與字典保持一個列表並提供索引訪問。

2

字典中的項目順序未定義:http://msdn.microsoft.com/en-us/library/ekcfxy3x.aspx也就是說,值集合的順序只能保證與順序相同,但Dictionary保留更改它們的權利。

其他選項: 你可以看看老NameObjectCollection - 它你的要求,但它早仿製藥,所以它只是一個對象字典(如果你使用反射器來查看NameObjectCollection,你會看到他們做了同樣的事情 - 他們真的實現了2個集合,一個HashTable和一個List)。

你可以將它們只存儲在一個列表中,並使用LINQ進行搜索,但這是一個很好的解決方案,取決於你需要存儲多少項目(字典查找是O(1),列表搜索將是O (n)最好