我有一個用字母鍵和數字鍵值的散列表。 如何根據密鑰對散列表進行排序?c#按鍵排序的散列表
ExchangeA, 200
ExchangeV, 100
ExchangeC, 200
是這樣
ExchangeA, 200
ExchangeC, 200
ExchangeV, 100
我有一個用字母鍵和數字鍵值的散列表。 如何根據密鑰對散列表進行排序?c#按鍵排序的散列表
ExchangeA, 200
ExchangeV, 100
ExchangeC, 200
是這樣
ExchangeA, 200
ExchangeC, 200
ExchangeV, 100
您可以使用此將由鍵爲你做一個排序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
值得注意的是'SortedDictionary'由二叉查找樹內部實現,並且具有'O(lg n)'檢索而不是預期的'O(1)檢索散列表。根據OP的需要,他可能需要這個,或者他可能想要做一個OrderBy,就像在其他答案中一樣 – 2012-02-14 16:14:53
是的 - 這是一個很好的做法 - 使用SortedDictionary只有在按鍵順序檢索時纔是有價值的「O(lg n)」仍然很好,但肯定比'O(1)'更差 – BrokenGlass 2012-02-14 16:18:32
@GabeMoothart還有'SortedDictionary <,>'的另一個優點:它不會執行/關鍵查找時間不使用數組,而'Dictionary <,>'做。如果你有大量的對象,並且你遇到大對象堆碎片的問題,'SortedDictionary <,>'是一個快速的解決方案,讓你的數據遠離大對象堆。 – phoog 2012-02-14 16:42:32
使用列表,而不是一個散列(或散列轉換爲一個字典),並做到這一點:
var dictionary = new Dictionary<string, int>();
var l = dictionary.Keys.ToList();
l.Sort();
foreach (var key in l)
{
Console.WriteLine(dictionary[key]);
}
由於哈希表的性質,您無法在鍵上對它們進行排序:它們根據哈希代碼組織它們的哈希密鑰,這是哈希表控制之外的值。但是,您可以按照您喜歡的順序讀取鍵值對。下面是如何使用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);
}
使用LINQ容易(using System.Linq
):
var sortedList = (from kv in MyDictionary select kv order by kv.Key).ToList<KeyValuePair<string, int>>();
返回的KeyValuePair<string, int>
列表。
,我發現最簡單的方法「之類的」哈希表是:
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
我用了一個列表,哈希表的密鑰存儲和整理,然後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()])); }
散列表本身是一個無序的數據結構。你想做什麼?這將有可能創建一個鍵/值對的排序列表,這將做你想要的? – 2012-02-14 16:05:50
幾個答案建議使用linq的'Enumerable.OrderBy'擴展方法。值得一提的是,哈希表和字典可以有自定義的相等比較器;如果您依賴於此功能,則可能需要使用接受自定義「IComparer」實例的'OrderBy'重載,以提供與用於編譯哈希表或字典的等式關係兼容的順序。 – phoog 2012-02-14 16:49:15
我想說你想使用SortedList或者SortedDictionary – 2014-02-04 09:51:06