Aktualizacja listboxa poprzez pętlę foreach

0

Witam.
Zaczynam duży projekt w c#, który w swoim założeniu powinien pomóc mi z archiwizacją danych na dyskach zewnętrznych na których znajdują się pliki video. I mam taki problem. W jaki sposób poprzez wykonywanie sie warunku foreach czyścić zawartość komórki w listboxie? Otóż mam ich 2. Aby automatycznie segregować pliki wedle nazw (za pomocą regexa) przenosze nazwy z jednego listboxa do drugiego w odpowiednie miejsce. Także pętla wygląda tak:

foreach (string temp in listBox1.Items)
                    {
                        Match m = Regex.Match(temp, porownanie, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                        if (m.Success)
                        {
                            listBox2.Items.Insert(lista4 +2, temp);
                        }
                    } 

Wyjaśnienie:
temp - wyciągnięty wpis z listboxa1
porownanie - wzorzec
lista4 + 2 - indeks z umieszczonym wzorcem znajdujący sie w listboxie2. Specjalnie tak zrobiłem, że listbox2 będzie wczytywał plik txt z posegregowanymi już wpisami. Program wczytuje dynamicznie gdzie dopisać nowy wpis z listboxa1 (aktualizuje tylko a nie tworzy na nowo całej listy). Dlatego w list4 mamy indeks pod którym umieszczony jest wzorzec a wpis powinien pojawić sie 2 pozycje pod nim.

Chciałbym aby po spełnieniu warunku m.success i dopisaniu elementu do listboxa2, wpis z listboxa1 został albo usunięty trwale albo przynajmniej go wyzerować aby warunek nigdy nie był spełniony (tym samym dany wpis nie pojawi sie w parunastu miejscach jednocześnie w zależności od wzorca). Można by to zrobić poprzez setselected i potem remove ale wtedy będzie problem z pętlą bo zmieni sie warunek foreach. W takim razie aktualizacja do 0. Jak to najłatwiej zrobić?

0

W pętli foreach nie można modyfikować kolekcji po której się iteruje. Dlatego też iterując po kolekcji listBox1.Items nie możesz z niej usuwać elementów (dodawać też).
Najprościej chyba by było skopiować kolekcję listBox1.Items i na niej iterować foreach'em wtedy mógłbyś usuwać elementy z listBox1.Items.

Jeśli chodzi o zerowanie to było by to możliwe gdyby stringi na to pozwalały. Niestety nie ma żadnej metody w klasie string typu Clear();

W sumie to chyba nie jest to nawet możliwe, ze względu na niezwykłość tej klasy, chodzi mi o fakt, że stringi są typu referencyjnego ale takiego jakiegoś udziwnionego. Ale to już inny temat.

0

Najlepiej byłoby chyba oddzielić logikę aplikacji od warstwy prezentacji. Na listach w pamięci operować, a w kontrolkach jedynie wyświetlać dane.

0

Bardzo wielka szkoda, że nie ma na to jakiegoś prostszego sposobu oszczędzającego moc obliczeniową i zasoby. Ja sobie poradziłem przez:

 
 foreach (string temp in listBox1.Items)
                    {
                        Match m = Regex.Match(temp, porownanie, System.Text.RegularExpressions.RegexOptions.IgnoreCase);
                        if (m.Success)
                        {
                            listBox2.Items.Add(temp);
                            listbox4.Items.Add(i);
                            //listBox2.Items.Insert(lista4 +2,temp);
                        }

                        i++;
                    }
                    listBox2.Visible = true;
                    listBox1.Visible = false;
                    foreach (int dowywalenia in listbox4.Items)
                    {
                        try { listBox1.SetSelected(dowywalenia, true); listBox1.Items.Remove(listBox1.SelectedItem); }
                        catch { }
                    }
                    
                    listBox1.Visible = true;

Po prostu korzystamy z nowego listboxa. Do niego wpisujemy indexy z rekordami z listboxa1 jakie mają zostać usunięte i po każdym sprawdzeniu elementów listboxa1 z wzorcem, wywalamy poprzez pętle elementy listy wskazane przez listboxa4.

0

Zacznijmy od tego że użycie foreach jest niewydajne! Oczywiście widać to przy dużych kolekcjach dopiero, lub przy oprerowaniu na dużych obiektach (w sensie zajętości pamięci).
Jeśli listbox4 używasz tylko do składowania elmentów do usunięcia, a nigdzie go nie pokazujesz to winszuję genialności rozwiązania (sarkazm, żeby nie było wątpliwości). Sposób usuwania elementów z listbox1 też powala mnie na łopatki.

Jeśli nie chcesz posłuchać rady somekind, bo nie wiesz jak, to tylko twój błąd.

Przez kolekcję Items możesz przeiterować się za pomocą tradycyjnego for i użyć indeksera, w tedy będziesz mógł od razu modyfikować kolekcję Items.
Do usuwania używa się Remove lub RemoveAt (jeśli chcesz to po indexie zrobic!).
Żeby mieć tymczasowy składzik na lietę int'ów to aż prosi się o użycie List<int>.

Słowem zamiast brać się za duży projekt, weź się za książkę.

0

Zacznijmy od tego że użycie foreach jest niewydajne!
Robiłem kiedyś różne testy, i niewiele różniło się od zwykłego for-a. Czasem w jedną, czasem w drugą stronę.

Przez kolekcję Items możesz przeiterować się za pomocą tradycyjnego for
trzeba tylko uważać, że podczas usuwania elementów z listy licznik pętli się nam rozjeżdża.

0

Generalnie robisz to źle. Wszystkie operacje robisz w pamięci, na listach, tablicach, etc. Chcesz wyświetlić wynik, korzystasz z listBox1.DataSource = listaIntow;

0
Jimmus napisał(a)

Bardzo wielka szkoda, że nie ma na to jakiegoś prostszego sposobu oszczędzającego moc obliczeniową i zasoby.

Bardzo wielka szkoda, że programować trzeba umieć.

0
massther napisał(a)

Zacznijmy od tego że użycie foreach jest niewydajne! Oczywiście widać to przy dużych kolekcjach dopiero, lub przy oprerowaniu na dużych obiektach (w sensie zajętości pamięci).
Jeśli listbox4 używasz tylko do składowania elmentów do usunięcia, a nigdzie go nie pokazujesz to winszuję genialności rozwiązania (sarkazm, żeby nie było wątpliwości). Sposób usuwania elementów z listbox1 też powala mnie na łopatki.

Jeśli nie chcesz posłuchać rady somekind, bo nie wiesz jak, to tylko twój błąd.

Przez kolekcję Items możesz przeiterować się za pomocą tradycyjnego for i użyć indeksera, w tedy będziesz mógł od razu modyfikować kolekcję Items.
Do usuwania używa się Remove lub RemoveAt (jeśli chcesz to po indexie zrobic!).
Żeby mieć tymczasowy składzik na lietę int'ów to aż prosi się o użycie List<int>.

Słowem zamiast brać się za duży projekt, weź się za książkę.

Pozwolę sobie skomentować tego posta bo zaciekawił mnie procent sensownych i na prawdę pomocnych porad do procentu wywyższania się i nauczania ludu ciemnego i zacofanego. Z całej tej listy literek jakie napisałeś wystarczyło zostawić fragment o tym jak można mój problem rozwiązać. Wszelkiej maści wstawki o tym co Cie rozwala na łopatki mnie kompletnie nie obchodzą bo jak chcesz pomóc to napisz mi po prostu co i jak robię źle i najlepiej dlaczego a nie rzucać tekstami nic nie wnoszącymi do tematu a powodującymi tylko moją niechęć do Twojej osoby (co jak mniemam masz i tak gdzieś więc tym bardziej mnie to śmieszy). Tak sie składa, że korzystam z rozwiązań na codeguru, tej strony i przede wszystkim msdn. Dodatkowo korzystam np z książki Stephena C. Perry`ego pt "C# i .NET" i paru innych. Niestety nie ma tam napisane dlaczego tak zrobić (no dziwne nie prawda?) a nie tak więc moje pytanie do użytkowników forum, którzy programują dłużej niż ja i na pewno znają sie na tym lepiej. Chyba, że nie wolno to zamknijmy to forum i już! Używanie szarych komórek nie boli.

Bardzo wielka szkoda, że programować trzeba umieć.

Kolejny wnoszący wiele wpis do całego tematu, bardzo pomocny i na miejscu. Odniósłbym sie do tematu programowania ale ciekaw jestem czy w ogóle wiesz co to jest... Bo jeżeli dla Ciebie "programować" to znajomość od razu wszystkiego związanego z językiem programowania... najbardziej wydajnych rozwiązań i możliwości... to gratuluje IQ bo na prawdę trzeba być niesamowicie pojętnym i inteligentnym aby być lepszym od programistów piszących książki mających 25 lat stażu w tym 8 lat w danym języku... Gratuluje.. Napisałem tylko jakie rozwiązanie jest w chwili obecnej. Teraz PRACUJE nad tym co mi napisałeś aby to oddzielić. Nie widze żadnych powodów aby rzucać takimi hasłami. Smutne.

Prosiłbym adminów o zamknięcie tematu bo zaczynają sie w nim wypowiadać osoby, których widocznie jedynym celem jest atakowanie i "pouczanie" a nie pomoc lub pokazanie rozwiązania. Przykro mi, że na forum wyglądające na profesjonalne i jedno z lepszych w Polsce, pojawiają sie tacy ludzie. No ale cóż. Należałoby w regulaminie zastrzec, że osoby bez 10 lat w zawodzie, specjalizujących sie w danym języku nie mają prawa o nic pytać. To, że programujecie w tym jak mniemam od paru lat (a zapewne ogólnie dłużej) to super ale nie znaczy, że trzeba innych ubijać. Albo pomagacie albo nie wypowiadajcie sie.

Reszcie dziękuję za pomoc. Amen.

0
Jimmus napisał(a)

Kolejny wnoszący wiele wpis do całego tematu, bardzo pomocny i na miejscu.

Mój pomocny post już tu był. Jeśli jest niejasny, to zawsze można dopytać o szczegóły.

Odniósłbym sie do tematu programowania ale ciekaw jestem czy w ogóle wiesz co to jest... Bo jeżeli dla Ciebie "programować" to znajomość od razu wszystkiego związanego z językiem programowania...

Dla mnie programowanie to myślenie. Wybacz, ale realizowanie obliczeń przy użyciu komponentów GUI nie ma nic wspólnego ani z jednym ani z drugim. Niestety, ale sprawiasz wrażenie osoby, która nigdy w życiu nic nie zaprogramowała, a nagle rzuciła się na wyklikiwanie interfejsu okienkowego, bo chce sobie coś na szybko zrobić. Efektem jest maksymalne skomplikowanie prostych zadań, tak jak u Ciebie.

Moja rada jest taka - najpierw napisz ten program w wersji konsolowej, a potem przenieś do okienkowej. Nauczysz się pięć razy więcej, a efekt będzie trzy razy lepszy.

Nie widze żadnych powodów aby rzucać takimi hasłami. Smutne.

Napisałeś bzdurę, że czegoś się nie da zrobić, tak jakbyś był tego pewien. Nie dziw się reakcji.
I nie płacz, że ktoś tu się nabija z braków wiedzy, bo tak nie jest. Co najwyżej z lenistwa, bzdurnych tez bądź ignorowania dobrych rad.

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