Silverlight 3: порядок итераций в универсальном словаре с использованием foreach KeyValuePair - PullRequest
1 голос
/ 08 февраля 2010

В Silverlight3, когда универсальный словарь итерируется с помощью foreach и KeyValuePair, гарантируется ли итерация посещение элементов в словаре в порядке их добавления? То есть последовательность итераций не имеет ничего общего с типом данных ключа или его значением? Документация на это не совсем понятна:

Этот код выдаст , аналогичный следующему: http://msdn.microsoft.com/en-us/library/bwabdf9z.aspx (выделение добавлено)

Dictionary<String, Object> 
foreach (KeyValuePair String, Object kvp in myDictionary) {}

Dictionary<UInt16, String> 
foreach (KeyValuePair UInt16, String kvp in myDictionary) {} 

Спасибо

Ответы [ 3 ]

2 голосов
/ 29 марта 2011

Спецификация для словаря говорит, что порядок итераций не определен. Таким образом, вы не должны зависеть от того, чтобы быть чем-либо.

Реальность такова, что если вы декомпилируете фактическую реализацию, используя что-то вроде Reflector, вы увидите, что он использует вспомогательный массив для свойств Values ​​/ Keys (с часовыми для удаленных элементов). То, как это реализовано, приводит к итерации в порядке добавления вещей. Вы просто не можете полагаться на это. Я предполагаю, что есть несколько людей, невольно зависящих от такого поведения, поэтому я сомневаюсь, что они изменят это в ближайшее время. Я все еще не хотел бы полагаться на это ни на что, кроме быстрого одноразового кода, хотя.

1 голос
/ 08 февраля 2010

Я бы не делал код зависимым от определенного порядка сортировки. Если вам нужна коллекция / словарь, который повторяется в определенном порядке, вы должны сначала упорядочить его (используя метод Linq OrderBy). Даже если ваш код сегодня в порядке, вы можете воспользоваться предстоящим параллельным выполнением задач, а затем пересмотреть детали реализации вашего кода.

1 голос
/ 08 февраля 2010

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

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