我有一个将字符串映射到整数的Hashtable。字符串是唯一的,但有几个可以映射到相同的整数。
我天真的方法是简单地将Hashtable反转为由Hashtable的值索引的SortedList,但问题是只要两个Hashtable的字符串映射到相同的值就会出现冲突。
列出由值排序的整个Hashtable(键和值)的最有效方法是什么? (如果两个值相同,我不关心它们的排序。)
答案 0 :(得分:9)
使用Linq:
hashtable.Cast<DictionaryEntry>().OrderBy(entry => entry.Value).ToList()
答案 1 :(得分:1)
你说你想要最有效的方法。以下代码是我能找到的最好的代码。
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%。
答案 2 :(得分: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);
答案 3 :(得分:0)
除了你有一个使用原始值(即整数)作为键的SortedList(或类似)以及值具有原始键列表之外,你想到的直接方式是你所拥有的。 (如果我理解正确,那就是字符串)。添加值有更多的麻烦(因为你需要检查它们是否存在并将它们添加到列表中,如果是这样或者另外创建一个新列表)。可能有更好的方法,但这是一个让人想起的方法......