Словарь C # добавляет запись в неправильном порядке

#c# #windows-phone-8 #dictionary

#c# #windows-phone-8 #словарь

Вопрос:

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

 public Dictionary<int, Route> RoutingList = new Dictionary<int, Route>();
  

Например:

1, маршрут
2, маршрут
3, маршрут
4, маршрут
5, маршрут

Теперь я удаляю первую.

2, маршрут
3, маршрут
4, маршрут
5, маршрут

Добавив следующий элемент, я получаю этот список:

6, маршрут
2, маршрут
3, маршрут
4, маршрут
5, маршрут

И после этого первый (6) будет удален. Но это неправильно. Я хочу удалить № 2.

Почему?

 int key = RoutingList.LastOrDefault().Key;
RoutingList.Add(key   1, tmpRoute);

if (RoutingList.Count == 5)
{
    RoutingList.Remove(RoutingList.First().Key);
}
  

Комментарии:

1. как вы удаляете? по ключу?

2. да, ключом с этой строкой : RoutingList.Remove(RoutingList.First().Key);

Ответ №1:

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

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

 List<Route> routes;
Route route = routes[key];
  

Комментарии:

1. Извините. Не удается использовать OrderedDictionary, потому что он недоступен в Windows Phone 8 Framework. Но я думаю, что это хорошая идея без словарного ключа. Мне не нужен ключ.

2. @6EQUJ5HD209458b: Рад, что это полезно — я не до конца знаком с W8 phone framework — есть ли сайт MSDN с пространствами имен / классами, которые вы используете? Похоже, что у обычного .NET Framework нет фильтра телефона.

Ответ №2:

Вы не можете полагаться на порядок элементов в словаре. Если вам нужно удалить запись с наименьшим идентификатором, альтернативой OrderedDictionary было бы изменить изменение вашего запроса (я не уверен на 100%, что это будет скомпилировано, поскольку сейчас у меня нет VS, но вы поняли идею):

 if (RoutingList.Count == 5)
{
    RoutingList.Remove(RoutingList.Keys.Min());
}
  

Ответ №3:

Согласно MSDN:

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

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