@smaclell fragte in einem Kommentar zu @ sambo99, warum die umgekehrte Iteration effizienter sei.
Manchmal ist es effizienter. Stellen Sie sich vor, Sie haben eine Personenliste und möchten alle Kunden mit einer Bonität <1000 entfernen oder filtern.
Wir haben die folgenden Daten
"Bob" 999
"Mary" 999
"Ted" 1000
Wenn wir vorwärts iterieren würden, würden wir bald in Schwierigkeiten geraten
for( int idx = 0; idx < list.Count ; idx++ )
{
if( list[idx].Rating < 1000 )
{
list.RemoveAt(idx);
}
}
Bei idx = 0 entfernen wir Bob
, wodurch alle verbleibenden Elemente nach links verschoben werden . Das nächste Mal durch die Schleife ist idx = 1, aber Liste [1] ist jetzt Ted
statt Mary
. Wir überspringen Mary
versehentlich. Wir könnten eine while-Schleife verwenden und weitere Variablen einführen.
Oder wir kehren einfach die Iteration um:
for (int idx = list.Count-1; idx >= 0; idx--)
{
if (list[idx].Rating < 1000)
{
list.RemoveAt(idx);
}
}
Alle Indizes links vom entfernten Element bleiben gleich, sodass Sie keine Elemente überspringen.
Das gleiche Prinzip gilt, wenn Sie eine Liste von Indizes erhalten, die aus einem Array entfernt werden sollen. Um die Dinge gerade zu halten, müssen Sie die Liste sortieren und dann die Elemente vom höchsten zum niedrigsten Index entfernen.
Jetzt können Sie einfach Linq verwenden und auf einfache Weise deklarieren, was Sie tun.
list.RemoveAll(o => o.Rating < 1000);
In diesem Fall ist es nicht effizienter, ein einzelnes Element vorwärts oder rückwärts zu iterieren. Sie können hierfür auch Linq verwenden.
int removeIndex = list.FindIndex(o => o.Name == "Ted");
if( removeIndex != -1 )
{
list.RemoveAt(removeIndex);
}