按(可能是非唯一的)值对Hashtable进行排序

我有一个将字符串映射到整数的Hashtable。 字符串是唯一的,但有几个可能映射到相同的整数。

我天真的方法是简单地将Hashtable反转为由Hashtable的值索引的SortedList,但问题是只要两个Hashtable的字符串映射到相同的值,就会发生冲突。

列出由值排序的整个Hashtable(键和值)的最有效方法是什么? (如果两个值相同,我不关心它们的排序。)

使用Linq:

hashtable.Cast().OrderBy(entry => entry.Value).ToList() 

也许这可行:

 myhashtable.Keys.Select(k => new List() {k, myhashtable[k]}) .OrderBy(item => item[1]); 

这应该给你一个列表列表,嵌套列表包含两个元素,键和值。 按值排序(第二个元素)。

我不太确定Hashtable是否有KeyValuePair类型……这样的东西也可以工作:

 myhashtable.Items.OrderBy(kvp => kvp.Value); 

脑海中浮现的直接方式是你所拥有的,除了你有一个SortedList(或类似的)使用原始值(即整数)作为键和值有一个原始键的列表(即如果我理解正确的字符串)。 添加值有更多的麻烦(因为你需要检查它们是否存在并将其添加到列表中,如果是这样,否则创建一个新列表)。 可能有更好的方法,但这是一个立即浮现在脑海中的方法……

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

 Hashtable hashtable = GetYourHashtable(); var result = new List(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%。