2010-02-14 9 views
5

Mam problem z oświadczeniem foreach w moim projekcie. Do tej pory mam kod:Foreach oświadczenie w polu listy

foreach(object i in listboxFiles.Items) 
    { 
     if (i == ".ftpquota") 
     { 
      listboxFiles.Items.Remove(i); 
     } 
     if (i == ".") 
     { 
      listboxFiles.Items.Remove(i); 
     } 
     if (i == "..") 
     { 
      listboxFiles.Items.Remove(i); 
     } 
    } 

Mam to w 1 sekundowym czasomierzu. Otrzymuje nazwę przedmiotu w porządku, ale kiedy dochodzi do oświadczeń if mówi, że nie pasują, ale robią to?

+1

Posiadanie tego w 1 sek. timer brzmi jak dużo pracy ... po co? Czy to naprawdę konieczne? byłoby znacznie lepiej wykonać ten kod * tylko * jeśli lista rzeczywiście się zmieniła (są na to zdarzenia!). –

+0

To dlatego, że istnieje przycisk odświeżania, ale przypuszczam, że mógłbym go mieć na końcu przycisku. – Crazyd22

Odpowiedz

6

Po pierwsze, zmieniasz kolekcję , podczas gdy iteruje nad nią. To nie działa, więc twój kod jest zasadniczo zepsuty.

Istnieje kilka sposobów, aby to naprawić; najprostszy w przypadku byłoby skopiować kolekcję przedmiotów, iteracji nad kopią i zmianę (= usunięcie z) oryginał:

var items = new System.Collections.ArrayList(listboxFiles.Items); 

foreach (var item in items) { 
    if (item.Equals(".")) 
     listboxFiles.Items.remove(item); 
    … 
} 

Po drugie, jesteś porównywania object do string, stąd operator == robi sprawdzanie równości zamiast testowania równości łańcuchów. Albo użyj Equals lub wykonaj odpowiednią obsadę.

+0

Hej, próbowałem tego, ale nie dostaję błędu, że nie mogę przekonwertować obiektu na bool. Również otrzymuję "Nie można przypisać do" i ", ponieważ jest to" zmienna iteracyjna foreach " – Crazyd22

+0

@Crazy: spróbuj ponownie, używając * mojego * kodu. Oczywiście zrobiłeś coś inaczej, ponieważ mój kod * nie * daje te błędy: nie przypisuję zmiennej pętli i nie konwertuję na wartość logiczną. –

+0

Spróbuję tego dzięki – Crazyd22

2

Sprawdzanie równości nie działa, ponieważ należy najpierw rzucić na ciąg i przeprowadzić odpowiednie porównanie ciągów.

np.

Jeśli usuniesz przedmioty z kolekcji przedmiotów podczas iteracji kolekcji, możesz napotkać problemy. Jednym ze sposobów obejścia tego problemu jest rozpoczęcie od ostatniego elementu i odliczanie wstecz, w związku z czym wszelkie wykonane usunięcia nie wpłyną na pozostałe elementy kolekcji, np.

for(var i = listboxFiles.Items.Count - 1; i >= 0; --i) 
{ 
    var item = listboxFiles[i]; 
    if (...) 
    { 
     listboxFiles.Items.RemoveAt(i); 
    } 
}