Pętla for poza zakresem

0

Witam,

Mam problem ze zrozumieniem przyczyny błędu. Mam podwójną pętlę for:

private void OdblokujLokalizacje(int nrpracownika)
{
  for (int z = 0; z < Tablice.ListaZajetychLokalizacji.Count; z++)
       {
        for (int a = 0; a < Lokalizacja[nrpracownika].Zablokowane.Count; a++)
           {
            if (Tablice.ListaZajetychLokalizacji[z].wspolrzedne ==Lokalizacja[nrpracownika].Zablokowane[a]) 
               {
                Tablice.ListaZajetychLokalizacji.RemoveAt(z);
                }
            }
        }
}

Tablice.ListaZajetychLokalizacji.Count=78. Dlaczego w takim razie w trakcie działania programu z przyjmuje wartość 78 (w warunku if). Wyrzucany jest błąd out of index co jest całkowicie zrozumiałe. Dodam, że Tablice.ListaZajetychLokalizacji to Lista choć to chyba nie ma tu znaczenia...
Ma ktoś jakiś pomysł? Rozwiązanie pewnie banalnie proste, ale patrze w to za długo i pewnie go nie widzę...
thx

0

Pewno dlatego, że usuwasz coś z tej kolekcji w tej pętli. Jak chcesz usuwać elementy kolekcji w for, to idź wstecz.

0
somekind napisał(a)

Pewno dlatego, że usuwasz coś z tej kolekcji w tej pętli. Jak chcesz usuwać elementy kolekcji w for, to idź wstecz.

Nie wiem czy Cię dobrze zrozumiałem. Chodzi o coś takiego???

private void OdblokujLokalizacje(int nrpracownika)
{
powtorz:
  for (int z = 0; z < Tablice.ListaZajetychLokalizacji.Count; z++)
       {
        for (int a = 0; a < Lokalizacja[nrpracownika].Zablokowane.Count; a++)
           {
            if (Tablice.ListaZajetychLokalizacji[z].wspolrzedne ==Lokalizacja[nrpracownika].Zablokowane[a]) 
               {
                Tablice.ListaZajetychLokalizacji.RemoveAt(z);
		goto powtorz;
                }
            }
        }
}
0

masz iterować od końca, a nie od początku. czyli zaczynasz od ostatniego elementu sprawdzanie (xxx.Count-1), a kończysz na 0.
coś na ten szablon:
for (int aaa = xxx.Count-1; aaa>=0; aaa--)

0

Raciczki opadają. Od kiedy używa się goto?

0
somekind napisał(a)

Raciczki opadają. Od kiedy używa się goto?

Hehe. Z pełną odpowiedzialnością przyznaję się do tej głupoty :) A tak poza tym to faktycznie należy iterować na odwrót i dodatkowo zamienić kolejność wykonywania
pętli...

Dzięki chłopaki za podpowiedzi
Pozdro

0

Nie wiem czy do końca zrozumiałeś swój błąd, więc szybko napiszę na przykładzie:
mamy listę o rozmiarze n=10. Mamy indeks i=5. Usuwamy element 5. Indeks nadal jest 5, ale "wskazuje" na element który był przed chwilą pod indeksem 6. Jeżeli pętla for kręci się dalej jak zawsze, to pominie ten jeden element. Ponieważ liczba elementów się zmniejszyła, to przy warunku i < n powoduje wyjście poza zakres tablicy. Prostym sposobem na obejście problemu jest cofanie (i--) indeksu wewnątrz for po usunięciu elementu.

0

kombinujecie.

private void OdblokujLokalizacje(int nrpracownika)
{
  foreach (var lok in Lokalizacja[nrpracownika].Zablokowane)
	Tablice.ListaZajetychLokalizacji.RemoveAll(o=>o.wspolrzedne == lok);
}

czy coś tego typu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1