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

时间:2010-06-23 12:38:49

标签: c# hashtable

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

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

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

4 个答案:

答案 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(或类似)以及值具有原始键列表之外,你想到的直接方式是你所拥有的。 (如果我理解正确,那就是字符串)。添加值有更多的麻烦(因为你需要检查它们是否存在并将它们添加到列表中,如果是这样或者另外创建一个新列表)。可能有更好的方法,但这是一个让人想起的方法......