Przeczytałem, że właściwość Keys klasy Dictionary nie musi zwracać za każdym razem tej zbioru w tej samej klasie, zwłaszcza kiedy elementy są dodawane/usuwane. A co jeżeli mam obiekt dictionary, który ma klauzurę readonly i wypełniany jest danymi w konstruktorze, czy mogę mieć pewność że kolejność będzie zachowana?
To jest źle zadane pytanie.
Kolejność elementów zwracana przez Keys jest nieokreślona. I na tym należy przerwać rozmyślanie.
Jeśli zależy ci na konkretnej kolejności, to sobie posortuj. Albo użyj innego kontenera...
Mój kontener wygląda dokładnie tak:
private readonly Dictionary<Button, Tuple<Image, Image>> menuButtons;
Słownik dla każdego przycisku przechowuje dwa obrazki: stan zwykły, stan zaznaczony. Jednocześnie może być zaznaczony jeden przycisk. Mam funkcję do zmiany zaznaczonego przyciska za pomocą strzałek:
if (keyData == Keys.Left || keyData == Keys.Right)
{
// It is dangerous
List<Button> buttons = menuButtons.Keys.ToList();
int indexButton = buttons.IndexOf(SelectedButton) + ((keyData == Keys.Left) ? -1 : 1);
if (indexButton < 0) indexButton = 0;
else if (indexButton >= buttons.Count) indexButton = buttons.Count - 1;
SelectedButton = buttons[indexButton];
}
Przyciski są ustawione jeden za drugim i w takiej kolejności są dodawane do słownika. W takim razie jaki kontener powinienem użyć aby rozwiązać mój problem?
Dictionary OK do przechowywania obrazków, ale kolejność przycisków trzymaj w List albo czymś podobnym, niezależnym od Dictionary.
Dzięki za radę :) zrobiłem jak napisałeś.