2010-06-23 60 views
3

我有一個將字符串映射到整數的散列表。字符串是唯一的,但有幾個可能映射到相同的整數。通過(可能非唯一)值對散列表排序

我的幼稚方法是簡單地將Hashtable顛倒爲由Hashtable的值索引的SortedList,但問題是一旦兩個Hashtable的字符串映射到相同的值,就會發生衝突。

什麼是最有效的方式列出我的整個Hashtable(鍵和值)排序的值? (如果兩個值是相同的,我不關心他們的排序。)

回答

0

也許這可以工作:

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); 
0

的直接方式,彈簧除了你有一個使用原始值(即整數)作爲關鍵字的SortedList(或類似的)並且值具有原始鍵的列表(即,如果我理解正確的話,字符串)之外, 。添加值時會涉及更多faff(因爲您需要檢查它們是否存在並將它們添加到列表中,否則創建新列表)。可能有更好的方法,但這是立即想到的那個...

0

你說你想要最有效的方法。以下代碼是我能找到的最好的代碼。

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%。