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😉
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
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😉
Oh, sry.. kleiner typo... ich pass es mal an.
Ansonsten gern geschehen 😉
muss nich i = list.count-1 sein ? 😉
Oh man... das war eben schnell reingehackt.. ich denke es sollte klar sein, was gemeint ist 😛
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😉
Diese ganze For(;;) Schleife könnte man sich sparen wenn es ein rofeach gäbe (foreach anders herum 😉)
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
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.
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.
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.
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.
@dr4g0n76
Mann, das ist ja mal ne coole Hilfsklasse, Danke für den Link .. 😉
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