Когда я перебираю словарь (общая структура данных .NET), он будет в том же порядке, в котором я их добавил? - PullRequest
9 голосов
/ 03 ноября 2008

У меня есть словарь, к которому я обычно обращаюсь с ключом, поэтому мне нужно быстрое чтение с произвольным доступом. Однако для одной функции мне нужно обработать каждый элемент в словаре, где важен порядок. Кажется, в тестах работает нормально. Можно ли зависеть от порядка элементов в словаре?

Ответы [ 5 ]

10 голосов
/ 03 ноября 2008

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

К сожалению, .NET не имеет словаря, который поддерживает это сам - это достаточно распространенный запрос - Java делает, как LinkedHashMap .

4 голосов
/ 24 мая 2011

Вы определенно не можете полагаться на Словарь <>, возвращающий результаты в том порядке, в котором вы их добавили - точно так же, как указано в документации.

При тестировании словарь <> всегда перечисляет KeyValuePairs <> в том же порядке, в котором они были добавлены. Тем не менее, Mono реализация Dictionary <> этого не делает. Mono следует документации при реализации поведения, и я предполагаю, что они увидели эту часть документации, а затем реализовали ее так, что не поддерживали порядок.

Другой вариант - использовать OrderedDictionary, который будет поддерживать порядок.

0 голосов
/ 03 ноября 2008

В документации четко указано, что «для целей перечисления каждый элемент в словаре рассматривается как структура KeyValuePair <(Of <(TKey, TValue>)>), представляющая значение и его ключ. Порядок в какие предметы возвращены не определено . " но я не уверен.

Во всех проведенных мною тестах элементы всегда упорядочены путем вставки.

Мне показалось это странным, потому что я также протестировал HashMap и LinkedHashMap (в Java), и порядок в HashMap не является правильным , как ожидалось, но, как сказал Джон Скит, порядок в LinkedHashMap.

Может ли кто-нибудь указать на провал теста с помощью словаря?

Вот код, который я использую для проверки:

        IDictionary<string, int> dic = new Dictionary<string, int>(10);

        Console.WriteLine("Adding ...");
        for (int i = 0; i < 1000000; i++)
        {
            Guid guid = Guid.NewGuid();
            dic.Add(guid.ToString(), i);
        }
        Console.WriteLine("Testing ...");

        bool first = true;
        int lastItem = 0;
        foreach (var item in dic.Values)
        {
            if (first)
            {
                first = false;
            }
            else
            {
                if (lastItem != item - 1)
                {
                    Console.WriteLine("Test Failed !");
                    break;
                }

            }
            lastItem = item;
        }
        Console.WriteLine("Done.");
0 голосов
/ 03 ноября 2008

tpower, Dictionary и SortedDictionary очень похожи в том, что они оба содержат коллекцию объектов, доступных по ключу. Они отличаются тем, как они построены внутри.

Насколько мне известно,

Dictionary быстрее для вставки, тогда как SortedDictionary построен поверх алгоритма поиска двоичного дерева и быстрее для чтения.

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

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

0 голосов
/ 03 ноября 2008

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

Edit: Либо так, либо добавьте свои ключи в связанный список, если вы хотите отслеживать порядок добавления элементов.

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