несортированный Hashtable - PullRequest
       46

несортированный Hashtable

0 голосов
/ 16 марта 2010

я пишу программу на C # у меня есть такой код

Hashtable ht = new Hashtable();
            ht.Add("1", "One");
            ht.Add("2", "Two");
            ht.Add("3", "Three");
            ht.Add("4", "Four");

но компилятор сортирует его я хочу знать, как я могу предотвратить сортировку хэш-таблицы пожалуйста, помогите мне

Ответы [ 8 ]

6 голосов
/ 16 марта 2010

A HashTable не выполняет сортировку как таковую. Он переставляет элементы на основе их хэш-кода, поэтому первоначальный порядок не сохраняется.

Если вы хотите сохранить исходный порядок или указать порядок сортировки, вы не можете использовать только HashTable.

Чтобы указать другой порядок сортировки, вы можете использовать SortedDictionary<T>. Чтобы сохранить исходный порядок, вы можете добавлять элементы как в Dictionary<T>, так и в List<T>.

1 голос
/ 16 марта 2010

Используйте взамен Dictionary<int, string> или Dictionary <string, string>.

1 голос
/ 16 марта 2010

Что вы подразумеваете под компилятором, сортирующим его? Сортировка определенно не производится. Как вы зацикливаетесь на предметах?

Я думаю, что порядок элементов при циклическом переключении клавиш не гарантируется ->

foreach(object key in hashtable.Keys){
...
}

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

0 голосов
/ 15 ноября 2018

Я нашел этот блог, http://mctexpert.blogspot.com/2014/12/keeping-hash-table-in-order.html

Чтобы быть точным, использование [Ordered] поможет сохранить исходную сортировку:

$Hash = [Ordered]@{"Apple"="Red";

"Orange"="Orange";

"Banana"="Yellow";

"Pear"="Green";

"Blueberry"="Blue";

"Plum"="Purple"}
0 голосов
/ 10 мая 2012

Чтобы получить значения в вашей хеш-таблице, упорядоченные по ключу (который выглядит так, как вы хотите), используйте это:

public List<string> GetOrderedValues(HashTable ht)
{
    // Get a sorted list of keys
    List<string> keys = new List<string>(ht.Keys.Cast<string>());
    keys.Sort();

    // Get values sorted by key
    List<string> values = new List<string>();
    foreach (string key in keys)
        values.Add(ht[key]);

    // Return Sorted Values
    return values;
}

Вы также можете разделить первую часть, а затем получить список отсортированных ключей и список отсортированных значений.

Другой вариант - вернуть список KeyValuePair, который будет отсортирован по записи

Опять же, почему бы просто не удалить весь пепел и заменить вашу хеш-таблицу списком KeyValuePair?

0 голосов
/ 16 марта 2010

Попробуйте это:

    Hashtable ht = new Hashtable();
    ht.Add("1", "One");
    ht.Add("2", "Two");
    ht.Add("3", "Three");
    ht.Add("4", "Four");

    foreach (var k in ht.Keys.sort)
    {
        Console.WriteLine(k);
    }

Обратите внимание на sort после ht.Keys

0 голосов
/ 16 марта 2010

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

Вы должны использовать List или другую структуру вместо Hashtable, если порядок элементов важен.

0 голосов
/ 16 марта 2010

При выполнении:

        Hashtable ht = new Hashtable();
        ht.Add("1", "One");
        ht.Add("2", "Two");
        ht.Add("3", "Three");
        ht.Add("4", "Four");

        foreach (var k in ht.Keys)
        {
            Console.WriteLine(k);
        }

Я не вижу никакой сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...