Недокументированная особенность словаря? - PullRequest
2 голосов
/ 11 мая 2010
Dictionary<string, int> testdic = new Dictionary<string, int>();
testdic.Add("cat", 1);
testdic.Add("dog", 2);
testdic.Add("rat", 3);
testdic.Remove("cat");
testdic.Add("bob", 4);

Заполните словарь, а затем удалите первый элемент. Затем добавьте новый элемент. Затем Боб появляется в позиции 1, а не в конце, поэтому он, кажется, запоминает удаленные записи и повторно использует это пространство памяти?

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

Ответы [ 2 ]

15 голосов
/ 11 мая 2010

Это не задокументировано, потому что это просто деталь реализации.

Реализация может измениться в любое время. (И если вы не внимательно изучили исходный код, вы даже не можете быть уверены, что ваши предположения о текущей реализации верны.)

Тип Dictionary<K,V> не гарантирует хранение его элементов в каком-либо конкретном порядке, и вам не следует полагаться на какое-либо недокументированное поведение, которое вы наблюдаете. Словарь представляет собой карту из ключей к значениям, не упорядоченный список.

Из документации MSDN :

Для целей перечисления ... [t] порядок, в котором возвращаются предметы, не определен.

3 голосов
/ 11 мая 2010

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

Реализация может быть наиболее эффективной. Это может означать, что текущая реализация демонстрирует поведение, которое вы видите. Но это не задокументировано, поэтому не стоит на это полагаться.

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