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
Instanzen aus Liste entfernen
freundblase
myCSharp.de - Member



Dabei seit:
Beiträge: 58

Themenstarter:

Instanzen aus Liste entfernen

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 1.439
Herkunft: Linz, Austria

beantworten | zitieren | melden

Schon mal in die Doku geschaut?
=>List<T>.RemoveAll
private Nachricht | Beiträge des Benutzers
michlG
myCSharp.de - Experte

Avatar #avatar-2909.png


Dabei seit:
Beiträge: 3.430
Herkunft: Naturns - Südtirol - Italien

beantworten | zitieren | melden

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

Avatar #avatar-3209.jpg


Dabei seit:
Beiträge: 309

beantworten | zitieren | melden

Zitat von michlG
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));}}
private Nachricht | Beiträge des Benutzers
marsgk
myCSharp.de - Member



Dabei seit:
Beiträge: 1.439
Herkunft: Linz, Austria

beantworten | zitieren | melden

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

Avatar #avatar-3271.jpg


Dabei seit:
Beiträge: 916

beantworten | zitieren | melden

Zitat
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...
private Nachricht | Beiträge des Benutzers
michlG
myCSharp.de - Experte

Avatar #avatar-2909.png


Dabei seit:
Beiträge: 3.430
Herkunft: Naturns - Südtirol - Italien

beantworten | zitieren | melden

Hallo
Zitat
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
Zitat
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
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 freundblase,

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

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



Dabei seit:
Beiträge: 58

Themenstarter:

beantworten | zitieren | melden

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

list.RemoveAll(l => l.id == 5);
private Nachricht | Beiträge des Benutzers