c # Hashtable отсортировано по ключам - PullRequest
5 голосов
/ 14 февраля 2012

У меня есть хеш-таблица с алфавитными ключами и числовыми значениями.как отсортировать хеш-таблицу по ключам?

ExchangeA, 200
ExchangeV, 100
ExchangeC, 200

, чтобы быть похожим на это

ExchangeA, 200
ExchangeC, 200
ExchangeV, 100

Ответы [ 6 ]

13 голосов
/ 14 февраля 2012

Для этого вы можете использовать SortedDictionary, который сделает сортировку по ключу за вас.В вашем случае SortedDictionary<string, int> будет работать:

SortedDictionary<string, int> dict = new SortedDictionary<string, int>();
dict.Add("Exchange C", 200);
dict.Add("Exchange A", 200);
dict.Add("Exchange V", 100);

foreach (var kvp in dict)
{
    Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
}

Вывод:

Key = Exchange A, Value = 200
Key = Exchange C, Value = 200
Key = Exchange V, Value = 100
5 голосов
/ 14 января 2014

Я нашел самый простой способ "сортировки" хеш-таблицы:

var hash = new Hashtable();
var orderedKeys = hash.Keys.Cast<string>().OrderBy(c => c); // supposing you're using string keys
var allKvp = from x in orderedKeys select new{ key = x, value = hash[x] };

Однако я не упорядочиваю оригинальную хеш-таблицу, а только читаю ее значения упорядоченным образом.

Как и в других ответах, если вам нужно хранить данные отсортированными, лучше всего использовать SortedDictionary

2 голосов
/ 14 февраля 2012

Из-за природы хеш-таблиц вы не можете отсортировать их по ключу на месте: они упорядочивают свои ключи в сегменты на основе своего хеш-кода, значения вне контроля хеш-таблицы.Однако вы можете читать пары ключ-значение в любом порядке, который вам нравится.Вот как вы можете сделать это с помощью LINQ:

IDictionary<string, int> d = ...; // your hash table
var ordered = d.OrderBy(p => p.Key).ToList();
foreach (var p in ordered) {
    Console.WriteLine("Key: {0} Value: {1}", p.Key, p.Value);
}
0 голосов
/ 05 апреля 2016

Я использовал список для хранения ключей Hashtable и отсортировал его, а затем отключил Hashtable, используя этот отсортированный список.Вот мой код:

        List<string> lst = new List<string>();
        foreach (var key2 in ht.Keys)
        {
            lst.Add(key2.ToString());
        }
        lst.Sort();
        foreach (var item in lst)
        {
            Console.WriteLine(string.Format("{0},{1}", item, ht[item.ToString()]));
        }
0 голосов
/ 14 февраля 2012

Использовать Linq легко (using System.Linq):

var sortedList = (from kv in MyDictionary select kv order by kv.Key).ToList<KeyValuePair<string, int>>();

Возвращает список KeyValuePair<string, int>.

0 голосов
/ 14 февраля 2012

Используйте список вместо хеша (или конвертируйте ваш хэш в словарь) и сделайте следующее:

var dictionary = new Dictionary<string, int>();
var l = dictionary.Keys.ToList();
l.Sort();
foreach (var key in l)
{
    Console.WriteLine(dictionary[key]);
}
...