Сортировать Hashtable по (возможно, не уникальным) значениям - PullRequest
3 голосов
/ 23 июня 2010

У меня есть Hashtable, который отображает строки в целые.Строки уникальны, но несколько могут быть сопоставлены одному и тому же целому числу.

Мой наивный подход состоял в том, чтобы просто инвертировать Hashtable в SortedList, который проиндексирован значениями Hashtable, но проблема в том, что вы получаете конфликткак только две строки Hashtable будут отображены на одно и то же значение.

Какой самый эффективный способ составить список всего моего Hashtable (ключи и значения), упорядоченного по значениям?(Там, где два значения одинаковы, меня не волнует их порядок.)

Ответы [ 4 ]

9 голосов
/ 23 июня 2010

Использование Linq:

hashtable.Cast<DictionaryEntry>().OrderBy(entry => entry.Value).ToList()
1 голос
/ 23 июня 2010

Вы сказали, что хотели самый эффективный метод.Следующий код - лучшее, что я смог найти.

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% быстрее.

0 голосов
/ 23 июня 2010

Непосредственный путь, который приходит на ум, - это то, что у вас есть, за исключением того, что у вас есть SortedList (или аналогичный), который использует исходные значения (то есть целые числа) в качестве ключей и в качестве значений имеет список исходных ключей(т.е. строки, если я правильно понимаю).При добавлении значений возникает немного больше ошибок (поскольку вам нужно проверить, существуют ли они, и добавить их в список, если это так, или создать новый список в противном случае).Возможно, есть лучшие методы, но это тот, который сразу приходит на ум ...

0 голосов
/ 23 июня 2010

Может быть, это может сработать:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...