Laden...

Instanzen aus Liste entfernen

Erstellt von freundblase vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.091 Views
F
freundblase Themenstarter:in
58 Beiträge seit 2009
vor 13 Jahren
Instanzen aus Liste entfernen

Ich suche nach einer eleganten Möglichkeit, Instanzen aus einer Liste entfernen, deren Property einem bestimmten Wert entspricht.
Also bspw. aus einer Liste von Personen alle Personen entfernen, die den Vorname "Max" haben.

Meine Lösung mit C#-Code ist zu kompliziert:
Ich lege eine neue Liste an, in der ich die zu entfernenen Instanzen nach Identifikation zwischenspeichere. Danach entferne ich mithilfe dieser Liste die Instanzen aus der Ursprungsliste. Bei C# kann man die Liste nicht verändern, die man durch-iteriert.

Gibt es evtl. eine elegante Lösung mit LINQ?

M
1.439 Beiträge seit 2005
vor 13 Jahren

Schon mal in die Doku geschaut?
=>List<T>.RemoveAll

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

Bei C# kann man die Liste nicht verändern, die man durch-iteriert.

Bei einer Foreach-Schleife ist das richtig.

Aber du kannst auch eine for-Schleife verwenden dann ist das kein Problem.
Du musst nur den Index um 1 verkleinern wenn du ein Element entfernst, weil sonst würdest du ein Element überspringen.

Einfacher ist es natürlich mit LINQ (wie marsgk) dir beschrieben hat.
Aber einfacher zu verstehen ist wohl die Variante mit der for-schleife 😃

Gruss
Michael

309 Beiträge seit 2008
vor 13 Jahren

Aber du kannst auch eine for-Schleife verwenden dann ist das kein Problem.
Du musst nur den Index um 1 verkleinern wenn du ein Element entfernst, weil sonst würdest du ein Element überspringen.

Schon richtig, aber an den Laufvariablen rumspielen halt ich für schlechten Stil, wenn mein Programmieren Prof. sowas sieht gibt's immer was auf die Lauscher 😉

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}

M
1.439 Beiträge seit 2005
vor 13 Jahren

Einfacher ist es natürlich mit LINQ (wie marsgk) dir beschrieben hat.
Aber einfacher zu verstehen ist wohl die Variante mit der for-schleife 😃

List<T>.RemoveAll hat nichts mit LINQ zu tun. RemoveAll ist eine normale Methode der List<T> Klasse.

Ich persönlich finde den Einzeiler RemoveAll wesentlich sprechender, als eine for-Schleife.

916 Beiträge seit 2008
vor 13 Jahren

Du musst nur den Index um 1 verkleinern wenn du ein Element entfernst, weil sonst würdest du ein Element überspringen.

Du kannst die Liste einfach Rückwärts durch iterieren, dann brauchst du den index nicht zu manipulieren.

Again what learned...

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo

List<T>.RemoveAll hat nichts mit LINQ zu tun. RemoveAll ist eine normale Methode der List<T> Klasse.

Ehm ja, da hast du wohl recht 😃
Ich dachte es ist eine der Extension Methods

Ich persönlich finde den Einzeiler RemoveAll wesentlich sprechender, als eine for-Schleife.

Ich finde es schon auch so leserlicher, aber da er schon mit der Schleife Probleme hatte hab ich mir gedacht dass es etwas einfacher ist wenn man es so macht und nicht gleich diese mächtige Variante verwendet.
Aber das kann er dann machen wie er will.

@freundblase: Guck mal hier: List<T>.RemoveAll-Methode

Grüsse

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo freundblase,

bitte immer erst in die FAQ schauen: [FAQ] Auflistungs-Elemente suchen und entfernen

herbivore

F
freundblase Themenstarter:in
58 Beiträge seit 2009
vor 13 Jahren

Vielen Dank!
RemoveAll kann man, wie auch Exists und Find, LINQ-Syntax übergeben:

list.RemoveAll(l => l.id == 5);