| 

.NET C# Java Javascript Exception

4
Ich habe eine Liste mit Zahlen (List<int>). Nun habe ich eine Schleife, die durch diese Liste läuft. Bestimmte Zahlen will ich entfernen. Rufe ich aber Remove auf, stürzt die Schleife ab, weil die Liste geändert wurde. Wie entferne ich Zahlen aus einer Liste, ohne dass die Schleife abstürzt?
25.05.2011
tazlwurm 41 1 2
4 Antworten
5
Bei einer List<t> würde ich
RemoveAll(Predicate<T> match)
nehmen. Das entfernt alle Einträge die match erfüllen aus der Liste.
25.05.2011
Noffls 215 4
3
Hallo,

du kannst mit LINQ die Liste filtern, und zwar derart dass alle nicht gewünschten Elemente rausfliegen. ZB
public IEnumerable<T> RemoveItems<T>(IEnumerable<T> source, Func<T, bool> condition)
{
return source.Where(i => !condition(i));
}

dabei wird mit "condition" die Löschbedingung angegeben und das Result ist eine Liste (bzw. ein IEnumerable<T> - zur Liste wirds mit ToList ;-) ohne die zu löschenden Elemente.

mfG Gü
25.05.2011
gfoidl 9,4k 3 5
2
Ich nehme an, dass du mit einer foreach-Schleife durch die Liste gegangen bist. Dann kommt durch das entfernen von Elementen der Enumerator durcheinander. Eine for ( int i = 0; i < list.count; ++i) - Schleife funktioniert auch nicht (oder jedenfalls nicht so einfach), weil dann beim Entfernen von Elementen die Indices der nachfolgenden Elemente verändert werden und dadurch nach dem Entfernen von Elementen Elemente ausgelassen werden.

Gehe mit einer for ( int i = list.count -1; i >= 0; --i ) - Schleife durch die Liste. Dann nimmst du die Elemente von hinten her raus, und die vorderen Elemente bekommen dadurch keinen anderen Index.

for ( int i = myList.Count -1; i >= 0; --i )
{
if ( bedingungErfüllt)
{
myList.RemoveAt(i);
}
}
25.05.2011
KN 1,7k 1 8
KN 1,7k 1 8
0
kopier dir das zu löschende Element in eine Variable:
for (int i = 0; i < yourList.Count; i++)
{
int remove = (from l in yourList
where i < 5
select l).FirstOrDefault();

yourList.Remove(remove);
}


die Liste zum Beispiel:
List<int> yourList = new List<int>();
for (int i = 1; i < 10; i++)
{
yourList.Add(i);
}
25.05.2011
Mario Priebe 6,0k 3 9
Wenn mehrere zutreffen dann wäre besser "remove" auch als IEnumerable<int> zu deklarieren, damit auch wirklich alle gelöscht werden auf die die Bedingung zutrifft. ;-)
gfoidl 25.05.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH