2012-02-14 73 views
4

我有一個用字母鍵和數字鍵值的散列表。 如何根據密鑰對散列表進行排序?c#按鍵排序的散列表

ExchangeA, 200 
ExchangeV, 100 
ExchangeC, 200 

是這樣

ExchangeA, 200 
ExchangeC, 200 
ExchangeV, 100 
+2

散列表本身是一個無序的數據結構。你想做什麼?這將有可能創建一個鍵/值對的排序列表,這將做你想要的? – 2012-02-14 16:05:50

+0

幾個答案建議使用linq的'Enumerable.OrderBy'擴展方法。值得一提的是,哈希表和字典可以有自定義的相等比較器;如果您依賴於此功能,則可能需要使用接受自定義「IComparer」實例的'OrderBy'重載,以提供與用於編譯哈希表或字典的等式關係兼容的順序。 – phoog 2012-02-14 16:49:15

+0

我想說你想使用SortedList或者SortedDictionary – 2014-02-04 09:51:06

回答

10

您可以使用此將由鍵爲你做一個排序SortedDictionary。在你的情況下,SortedDictionary<string, int>將工作:

SortedDictionary<string, int> dict = new SortedDictionary<string, int>(); 
dict.Add("Exchange C", 200); 
dict.Add("Exchange A", 200); 
dict.Add("Exchange V", 100); 

foreach (var kvp in dict) 
{ 
    Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value); 
} 

輸出:

Key = Exchange A, Value = 200 
Key = Exchange C, Value = 200 
Key = Exchange V, Value = 100 
+1

值得注意的是'SortedDictionary'由二叉查找樹內部實現,並且具有'O(lg n)'檢索而不是預期的'O(1)檢索散列表。根據OP的需要,他可能需要這個,或者他可能想要做一個OrderBy,就像在其他答案中一樣 – 2012-02-14 16:14:53

+0

是的 - 這是一個很好的做法 - 使用SortedDictionary只有在按鍵順序檢索時纔是有價值的「O(lg n)」仍然很好,但肯定比'O(1)'更差 – BrokenGlass 2012-02-14 16:18:32

+2

@GabeMoothart還有'SortedDictionary <,>'的另一個優點:它不會執行/關鍵查找時間不使用數組,而'Dictionary <,>'做。如果你有大量的對象,並且你遇到大對象堆碎片的問題,'SortedDictionary <,>'是一個快速的解決方案,讓你的數據遠離大對象堆。 – phoog 2012-02-14 16:42:32

0

使用列表,而不是一個散列(或散列轉換爲一個字典),並做到這一點:

var dictionary = new Dictionary<string, int>(); 
var l = dictionary.Keys.ToList(); 
l.Sort(); 
foreach (var key in l) 
{ 
    Console.WriteLine(dictionary[key]); 
} 
2

由於哈希表的性質,您無法在鍵上對它們進行排序:它們根據哈希代碼組織它們的哈希密鑰,這是哈希表控制之外的值。但是,您可以按照您喜歡的順序讀取鍵值對。下面是如何使用LINQ做到這一點:

IDictionary<string, int> d = ...; // your hash table 
var ordered = d.OrderBy(p => p.Key).ToList(); 
foreach (var p in ordered) { 
    Console.WriteLine("Key: {0} Value: {1}", p.Key, p.Value); 
} 
0

使用LINQ容易(using System.Linq):

var sortedList = (from kv in MyDictionary select kv order by kv.Key).ToList<KeyValuePair<string, int>>(); 

返回的KeyValuePair<string, int>列表。

4

,我發現最簡單的方法「之類的」哈希表是:

var hash = new Hashtable(); 
var orderedKeys = hash.Keys.Cast<string>().OrderBy(c => c); // supposing you're using string keys 
var allKvp = from x in orderedKeys select new{ key = x, value = hash[x] }; 

但是,我不是訂購的原始哈希表,只讀取一個有序的方式及其價值。

正如在其他答覆,如果你需要存儲的數據進行排序的方式,最好是使用SortedDictionary

0

我用了一個列表,哈希表的密鑰存儲和整理,然後dislayed使用Hashtable這個排序列表。這裏是我的代碼:

 List<string> lst = new List<string>(); 
     foreach (var key2 in ht.Keys) 
     { 
      lst.Add(key2.ToString()); 
     } 
     lst.Sort(); 
     foreach (var item in lst) 
     { 
      Console.WriteLine(string.Format("{0},{1}", item, ht[item.ToString()])); 
     }