我有一個將字符串映射到整數的散列表。字符串是唯一的,但有幾個可能映射到相同的整數。通過(可能非唯一)值對散列表排序
我的幼稚方法是簡單地將Hashtable顛倒爲由Hashtable的值索引的SortedList,但問題是一旦兩個Hashtable的字符串映射到相同的值,就會發生衝突。
什麼是最有效的方式列出我的整個Hashtable(鍵和值)排序的值? (如果兩個值是相同的,我不關心他們的排序。)
我有一個將字符串映射到整數的散列表。字符串是唯一的,但有幾個可能映射到相同的整數。通過(可能非唯一)值對散列表排序
我的幼稚方法是簡單地將Hashtable顛倒爲由Hashtable的值索引的SortedList,但問題是一旦兩個Hashtable的字符串映射到相同的值,就會發生衝突。
什麼是最有效的方式列出我的整個Hashtable(鍵和值)排序的值? (如果兩個值是相同的,我不關心他們的排序。)
使用LINQ:
也許這可以工作:
myhashtable.Keys.Select(k => new List<string, int>() {k, myhashtable[k]})
.OrderBy(item => item[1]);
這應該給你一個列表的列表,包含正好兩個嵌套表元素,關鍵和價值。按值排序(第二個元素)。
我不是很肯定,如果Hashtable中有一個KeyValuePair<K, V>
型......這樣的事情也可以工作:
myhashtable.Items.OrderBy(kvp => kvp.Value);
的直接方式,彈簧除了你有一個使用原始值(即整數)作爲關鍵字的SortedList(或類似的)並且值具有原始鍵的列表(即,如果我理解正確的話,字符串)之外, 。添加值時會涉及更多faff(因爲您需要檢查它們是否存在並將它們添加到列表中,否則創建新列表)。可能有更好的方法,但這是立即想到的那個...
你說你想要最有效的方法。以下代碼是我能找到的最好的代碼。
Hashtable hashtable = GetYourHashtable();
var result = new List<DictionaryEntry>(hashtable.Count);
foreach (DictionaryEntry entry in hashtable)
{
result.Add(entry);
}
result.Sort(
(x, y) =>
{
IComparable comparable = x.Value as IComparable;
if (comparable != null)
{
return comparable.CompareTo(y.Value);
}
return 0;
});
foreach (DictionaryEntry entry in result)
{
Console.WriteLine(entry.Key.ToString() + ":" + entry.Value.ToString());
}
我使用Linq進行了各種不同方法的實驗,但上面的方法快了大約25-50%。