Laden...

iteration durch kleiner werdende Liste

Erstellt von bigeddie vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.290 Views
B
bigeddie Themenstarter:in
372 Beiträge seit 2007
vor 13 Jahren
iteration durch kleiner werdende Liste

Hallo Gemeinde,

folgende Konstellation:
Eine Liste vom Typ T enthält n Elemente. T ist ein Typ welcher ein Flag zum löschen seiner Instanz aus der Liste enthält.
Ist das Flag gesetzt, so soll das Element aus der Liste entfernt werden und zum nächsten Element gegangen werden(nicht indexbasiert).
Wie stelle ich es am besten an die Liste von den Elementen zu bereinigen, in welchen das Flag gesetzt ist, ohne eine "riesen" Kopieraktion zu starten?

Grüße

bigeddie

Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉

C
401 Beiträge seit 2007
vor 13 Jahren

Hi,

ganz ohne Index geht es nicht, aber folgendes sollte dir helfen:


for(int i = list.Count - 1; i>= 0; i--) {
  if(list[i].Flag == Flag.MyFlag) {
    list.RemoveAt(i);
  }
}

Da die Liste rückwarts durchlaufen wird, werden auch keine Einträge übersprungen.

Gruß

Dario

typo edit: ++ zu --, Count - 1

L
416 Beiträge seit 2008
vor 13 Jahren

Dann aber mit i--

B
bigeddie Themenstarter:in
372 Beiträge seit 2007
vor 13 Jahren

Hi Corpsegrinder,

auf das umgekehrte durchlaufen der Liste wäre ich nie gekommen, Danke!

Aber muss es dann nicht



C#-Code:
for(int i = list.Count; i>= 0; i--) {
  if(list[i].Flag == Flag.MyFlag) {
    list.RemoveAt(i);
  }
}

heissen?

Grüße bigeddie

Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉

C
401 Beiträge seit 2007
vor 13 Jahren

Oh, sry.. kleiner typo... ich pass es mal an.

Ansonsten gern geschehen 😉

R
103 Beiträge seit 2009
vor 13 Jahren

muss nich i = list.count-1 sein ? 😉

C
401 Beiträge seit 2007
vor 13 Jahren

muss nich i = list.count-1 sein ? 😉

Oh man... das war eben schnell reingehackt.. ich denke es sollte klar sein, was gemeint ist 😛

B
bigeddie Themenstarter:in
372 Beiträge seit 2007
vor 13 Jahren

Stimmt, sonst ist "Index out of range", bin eben selbst damit auf die Nase gefallen.

Ist ja ein 0-basierter Index.

VG

bigeddie

Man muß nichts wissen,
man muß nur wissen wer es wissen könnte
oder wo es steht😉

1.361 Beiträge seit 2007
vor 13 Jahren

FAQ zum Thema [FAQ] Auflistungs-Elemente suchen und entfernen bitte durchlesen !

R
103 Beiträge seit 2009
vor 13 Jahren

Diese ganze For(;;) Schleife könnte man sich sparen wenn es ein rofeach gäbe (foreach anders herum 😉)

1.552 Beiträge seit 2010
vor 13 Jahren

Ich denke mal laut [Hinweis] Wie poste ich richtig? 10 sollte editieren nach Augenmaß geschehen. Denn nachträglich in älteren Posts was ändern was andere weiter unten verbessert haben bringt andere nur durcheinander. Da dankt sich ja einer: Was will denn Lennart und rasepretrep mit ihren Anmerkungen wenn es Corpsegrinder im ersten Post schon richtig geschrieben hat. Ansonsten würde ich es für angebracht sehen wenn ein Moderator die nachfolgenden Verbesserungsposts löscht

Hinweis von herbivore vor 13 Jahren

Da Corpsegrinder am Ende seines Beitrags angegeben hat, welche Änderungen er vorgekommen hat, bleibt aus meiner Sicht alles vollständig nachvollziehbar. Das Editieren ist also m.E. mit dem nötigen Augenmaß erfolgt.

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

L
416 Beiträge seit 2008
vor 13 Jahren

Diese ganze For(;;) Schleife könnte man sich sparen wenn es ein rofeach gäbe (foreach anders herum 😉)

Bitte den FAQ Artikel durchlesen ...

Angebracht wäre es wenn ein Mod den Thread schließt da es eigentlich eh um Grundlagen geht. Der FAQ Artikel erklärt alles nötige.

R
103 Beiträge seit 2009
vor 13 Jahren

Interessant, aber auch nicht die ultimative Wahrheit, die FAQ.

Methode#3 kommt einem rofeach schon näher, aber wie die Faq schon sagt kommt man ab und zu um die als "naiv" skizzierte Methode (warum eigentlich naiv?) nicht herum.

Die Idee mit den Backuplisten würde ich schon eher als "naiv" bezeichnen, aber das ist meine persönliche Meinung.

Da wäre ein rofeach schon angebracht oder wenn viele Einfüge- und Löschvorgänge anstehen wäre ohnehin eine LinkedList<T> besser, die löschen als o(1) Aufwand betreiben kann.

F
240 Beiträge seit 2006
vor 13 Jahren

foreach() garantiert keine feste Reihenfolge.

2.921 Beiträge seit 2005
vor 13 Jahren

oder Du siehst mal hier nach:

Hilfreiche Iteratoren / Improving Foreach

Ich denke IsoIter ist dann der richtige Ansatz, soweit ich das noch auswendig weiß.
Iso steht für Isolierend, d.h. die Schleife darf während der Iteration geändert werden.

Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.

R
103 Beiträge seit 2009
vor 13 Jahren

@dr4g0n76

Mann, das ist ja mal ne coole Hilfsklasse, Danke für den Link .. 😉

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Femaref,

foreach() garantiert keine feste Reihenfolge.

doch, foreach garantiert, dass die Elemente in der Reihenfolge durchgegangen werden, in der sie vom Enumerator geliefert werden. Für Arrays ist in der Sprachspezifikation sogar festgelegt:

The order in which foreach traverses the elements of an array is as follows: For single-dimensional arrays, elements are traversed in increasing index order, starting with index 0 and ending with index Length – 1.

Für andere listenartige Collections ist davon auszugehen, das Enumeratoren in analog dessen implementiert sind. Die ganze Geschichte gibt es in diesem foreach oder for? was ist schneller? Ist die Reihenfolge festgelegt? und den folgenden Beiträgen.

Hallo rasepretrep,

Interessant, aber auch nicht die ultimative Wahrheit, die FAQ.

ich wüsste nicht, was an der FAQ nicht stimmen sollte. Schreib bitte, was genau du meinst. Bis zum Beweis des Gegenteils gehe ich davon aus, dass die FAQ die ultimative Wahrheit darstellt.

Hallo zusammen,

bitte nichts nochmal durchkauen, was in der FAQ schon umfassend beantwortet ist.

herbivore