Можно ли фрагментировать коллекции? - PullRequest
0 голосов
/ 21 мая 2011

Рассмотрите возможность регистрации вступления новых членов в Dictionary и время вступления:

Dictionary<string, DateTime> members = new Dictionary<string, DateTime>();
members.Add("Bob", DateTimeNow);
Thread.Sleep(1000);
members.Add("Joe", DateTimeNow);
Thread.Sleep(1000);
members.Add("Susan", DateTimeNow);
Thread.Sleep(1000);
// Now Joe exits
members.Remove("Joe");
// Then Mike enters
members.Add("Mike", DateTimeNow);

Теперь вопрос в том, где находится Mike местоположение в Dictionary. Добавлен ли он в конец Dictionary или он заполнит пустое место Susan (если мы повторим с foreach или получим доступ к Dictionary через индекс)? Гарантируется ли поведение на все времена?

Ответы [ 3 ]

3 голосов
/ 21 мая 2011

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

Как говорит нам сайт MSDN, словарь реализован как хеш-таблица и:

Порядок, в котором возвращаются элементы, не определен.

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

1 голос
/ 21 мая 2011

Доступ к Dictionary осуществляется через key, а не через index - поэтому сам по себе вопрос имеет меньшее значение.
Как уже сказано во всех ответах - у Dictionary нет порядка, и он реализованчерез Hashtable ( вики-страница - найдите время, чтобы прочитать)

Dictionary само может развернуть и сжимать в зависимости от объема данных, которые он поддерживает, и собственной реализации, но при использовании богатой среды, такой как .NET, вам не нужно беспокоиться об этом вопросе, это делается длявы.Вы можете прочитать раздел Dynamic Resizing на странице WIKI, чтобы узнать о реализации, если она вас интересует.

1 голос
/ 21 мая 2011

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

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

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

...