2011-09-22 38 views
9

我有一個字典結構,裏面有多個鍵值對。如何插入字典中的第一個元素?

myDict.Add(key1, value1); 
myDict.Add(key2, value2); 
myDict.Add(key3, value3); 

我的字典被用作一些控件的數據源。在控件的下拉我看的項目是這樣的:

key1 
key2 
key3 

順序看起來與我的字典。 我知道字典不像arrayList - 你可以得到索引左右。 我無法使用sortedDictionary。 現在我需要一個更重要的價值對我的程序的某些點添加到這個字典中,我希望它有同樣的效果,我這樣做:

myDict.Add(newKey, newValue); 
myDict.Add(key1, value1); 
myDict.Add(key2, value2); 
myDict.Add(key3, value3); 

如果我這樣做,我知道則newkey將顯示在我的控制中作爲第一要素。

我有一個想法創造一個tempDict,把每對myDict到tempDict,然後清除myDict,再加入對回這樣的:

myDict.Add(newKey, newValue); 
myDict.Add(key1, value1); 
myDict.Add(key2, value2); 
myDict.Add(key3, value3); 

難道還有比這更好的辦法?

謝謝!

回答

19

Dictionary<K,V>確實不是有排序。任何感知的訂單維護都是偶然的(並且特定實現的人爲因素包括但不限於存儲桶選擇順序和計數)。

這些都是方法(只使用Base Class Libraries BCL)我知道:

  1. Lookup<K,V>
    • .NET4的,一成不變的,可以(在建手錶式兩份),鍵映射到多個值
  2. OrderedDictionary
    • 舊的非通用預期字典性能曼斯界限(其他兩種方法O(n) 「獲取(鍵)/套(鍵)」)
  3. List<KeyValuePair<K,V>>
    • .NET2/3還行,可變的,多跑腿,可以映射鍵多個值(在插入觀看重複)

編碼愉快。


創建哈希數據結構維持插入順序實際上只一個標準的散列實現的輕微的修改(紅寶石散列現在保持插入順序);然而,這不是在.NET中完成的,更重要的是它是Dictionary/IDictionary合同的一部分。

+0

你是什麼意思在查詢「手錶插入」?你是否認爲在向查詢插入值時需要小心?如果是這樣,那就不是這樣,因爲查找是不可變的。 – phoog

+0

@phoog由於它*可以*處理單個鍵到多個值,因此可能會導致字典無法實現的情況。措辭不理想。 – 2011-09-22 23:08:38

+0

+1這個優秀的答案 –

1

不要使用字典 - 不能保證在添加更多元素時鍵的順序不會改變。相反,請爲您的鍵值對(定義What is C# analog of C++ std::pair?爲例)定義類Pair,併爲您的數據源使用List<Pair>List有一個Insert操作,您可以使用它將新元素插入到列表中的任何位置。

+0

但我的控制需要字典來提供數據源,我們不想改變控制。 – spspli

+1

@spspli:好醫生在說什麼是你不要忽視「字典'的基礎知識。所以要麼改變你的數據結構,要麼你生活在一個無序的集合中。 – user7116

+3

如果您希望控件以特定的列表式順序顯示元素,並且唯一允許的數據源是字典(不提供特定順序),那麼您的控件是錯誤設計的,您不能指望爲您找到解決方案問題。因此,無論是改變控制方式,使用不同的控制方式,還是要找到更多關於控制的信息,是否有其他方法可以將訂購信息從外部輸入。 –

2

從MSDN頁上詞典(TKEY的,TValue):

對於枚舉的目的,字典中的每個項被視爲一個KeyValuePair <(中<(TKEY的,TValue>中)>)結構代表價值和關鍵。項目返回的順序是未定義的。

我假設你不能使用SortedDictionary,因爲控件取決於你的數據源是一個字典。如果控件需要字典類型和排序數據,則需要修改控件,因爲這兩個標準相互矛盾。如果您需要排序/排序功能,您必須使用其他數據類型必須。取決於未定義的行爲是在尋求麻煩。

5

你不能那樣做Dictionary類。由於數據結構的實施方式有些怪異,它在你的例子中起作用。數據結構實際上按時間順序將條目存儲在一個數組中,然後使用另一個數組索引到條目數組中。枚舉基於入口數組。這就是爲什麼它似乎是在你的情況下命令。但是,如果您應用一系列刪除和插入操作,您會注意到此訂購受到干擾。

改爲使用KeyCollection。它通過密鑰和索引提供O(1)檢索,並保留時間順序。

+0

+1希望我知道KeyCollection之前(但爲什麼它關閉在ComponentModel名稱空間,爲什麼它依靠被擴展?: - /) – 2011-09-22 21:11:49

+0

@pst:我不知道...好問題。 –

+0

+1 [KeyedCollection](http://msdn.microsoft.com/en-us/library/ms132438.aspx)正是我一直在尋找的! – Ben

1

字典不應該用來排序對象,而應該用來查找對象。如果你想讓它對對象進行排序,我會建議其他的東西。

如果你展開字典,沒有規則可以阻止它混淆你的列表。

相關問題