Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
iteration durch kleiner werdende Liste
bigeddie
myCSharp.de - Member



Dabei seit:
Beiträge: 369
Herkunft: Mannheim

Themenstarter:

iteration durch kleiner werdende Liste

beantworten | zitieren | melden

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;-)
private Nachricht | Beiträge des Benutzers
Corpsegrinder
myCSharp.de - Member



Dabei seit:
Beiträge: 401

beantworten | zitieren | melden

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
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Corpsegrinder am .
private Nachricht | Beiträge des Benutzers
Lennart
myCSharp.de - Member



Dabei seit:
Beiträge: 416
Herkunft: Bawü

beantworten | zitieren | melden

Dann aber mit i--
private Nachricht | Beiträge des Benutzers
bigeddie
myCSharp.de - Member



Dabei seit:
Beiträge: 369
Herkunft: Mannheim

Themenstarter:

beantworten | zitieren | melden

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;-)
private Nachricht | Beiträge des Benutzers
Corpsegrinder
myCSharp.de - Member



Dabei seit:
Beiträge: 401

beantworten | zitieren | melden

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


Ansonsten gern geschehen ;-)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Corpsegrinder am .
private Nachricht | Beiträge des Benutzers
rasepretrep
myCSharp.de - Member



Dabei seit:
Beiträge: 103

beantworten | zitieren | melden

muss nich i = list.count-1 sein ? ;)
private Nachricht | Beiträge des Benutzers
Corpsegrinder
myCSharp.de - Member



Dabei seit:
Beiträge: 401

beantworten | zitieren | melden

Zitat von rasepretrep
muss nich i = list.count-1 sein ? ;)

Oh man... das war eben schnell reingehackt.. ich denke es sollte klar sein, was gemeint ist :-P
private Nachricht | Beiträge des Benutzers
bigeddie
myCSharp.de - Member



Dabei seit:
Beiträge: 369
Herkunft: Mannheim

Themenstarter:

beantworten | zitieren | melden

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;-)
private Nachricht | Beiträge des Benutzers
zommi
myCSharp.de - Member

Avatar #avatar-2617.png


Dabei seit:
Beiträge: 1.361
Herkunft: Berlin

beantworten | zitieren | melden

FAQ zum Thema [FAQ] Auflistungs-Elemente suchen und entfernen bitte durchlesen !
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von zommi am .
private Nachricht | Beiträge des Benutzers
rasepretrep
myCSharp.de - Member



Dabei seit:
Beiträge: 103

beantworten | zitieren | melden

Diese ganze For(;;) Schleife könnte man sich sparen wenn es ein rofeach gäbe (foreach anders herum ;-))
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von rasepretrep am .
private Nachricht | Beiträge des Benutzers
xxMUROxx
myCSharp.de - Member

Avatar #avatar-3236.jpg


Dabei seit:
Beiträge: 1.552
Herkunft: Südtirol/Italien

beantworten | zitieren | melden

[offtopic]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[/offtopic]
Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

Moderationshinweis von herbivore (09.08.2010 - 16:44)

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.

private Nachricht | Beiträge des Benutzers
Lennart
myCSharp.de - Member



Dabei seit:
Beiträge: 416
Herkunft: Bawü

beantworten | zitieren | melden

Zitat von rasepretrep
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.
private Nachricht | Beiträge des Benutzers
rasepretrep
myCSharp.de - Member



Dabei seit:
Beiträge: 103

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Femaref
myCSharp.de - Member



Dabei seit:
Beiträge: 240

beantworten | zitieren | melden

foreach() garantiert keine feste Reihenfolge.
private Nachricht | Beiträge des Benutzers
dr4g0n76
myCSharp.de - Experte

Avatar #avatar-1768.jpg


Dabei seit:
Beiträge: 2.893
Herkunft: Deutschland

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
rasepretrep
myCSharp.de - Member



Dabei seit:
Beiträge: 103

beantworten | zitieren | melden

@dr4g0n76

Mann, das ist ja mal ne coole Hilfsklasse, Danke für den Link .. ;)
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Femaref,
Zitat
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:
Zitat
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,
Zitat
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
private Nachricht | Beiträge des Benutzers