778 Stimmen

LINQ verwenden, um Elemente aus einer List<T> zu entfernen

Angenommen, ich habe LINQ-Abfrage wie:

var authors = from x in authorsList
              where x.firstname == "Bob"
              select x;

Angesichts der Tatsache, dass authorsList ist vom Typ List<Author> wie kann ich die Author Elemente aus authorsList die von der Abfrage zurückgegeben werden, in authors ?

Oder, anders ausgedrückt, wie kann ich alle Vornamen, die gleich Bob sind, aus authorsList ?

Hinweis: Dies ist ein vereinfachtes Beispiel für die Zwecke der Frage.

1324voto

Jon Skeet Punkte 1325502

Nun, es wäre einfacher, sie von vornherein auszuschließen:

authorsList = authorsList.Where(x => x.FirstName != "Bob").ToList();

Dies würde jedoch nur den Wert von authorsList anstatt die Autoren aus der vorherigen Sammlung zu entfernen. Alternativ können Sie auch RemoveAll :

authorsList.RemoveAll(x => x.FirstName == "Bob");

Wenn Sie wirklich brauchen, um es auf der Grundlage einer anderen Sammlung zu tun, würde ich ein HashSet, RemoveAll und Contains verwenden:

var setToRemove = new HashSet<Author>(authors);
authorsList.RemoveAll(x => setToRemove.Contains(x));

164voto

Reed Copsey Punkte 536986

Es wäre besser, die List<T>.RemoveAll um dies zu erreichen.

authorsList.RemoveAll((x) => x.firstname == "Bob");

57voto

BlueChippy Punkte 5615

Wenn Sie wirklich Elemente entfernen müssen, was ist dann mit Except()?
Sie können auf der Grundlage einer neuen Liste entfernen oder durch Verschachtelung der Linqs spontan entfernen.

var authorsList = new List<Author>()
{
    new Author{ Firstname = "Bob", Lastname = "Smith" },
    new Author{ Firstname = "Fred", Lastname = "Jones" },
    new Author{ Firstname = "Brian", Lastname = "Brains" },
    new Author{ Firstname = "Billy", Lastname = "TheKid" }
};

var authors = authorsList.Where(a => a.Firstname == "Bob");
authorsList = authorsList.Except(authors).ToList();
authorsList = authorsList.Except(authorsList.Where(a=>a.Firstname=="Billy")).ToList();

34voto

Daniel Brückner Punkte 57561

Mit den Standard-LINQ-Operatoren ist dies nicht möglich, da LINQ nur Abfragen, aber keine Aktualisierungen unterstützt.

Sie können jedoch eine neue Liste erstellen und die alte Liste ersetzen.

var authorsList = GetAuthorList();

authorsList = authorsList.Where(a => a.FirstName != "Bob").ToList();

Oder Sie könnten alle Einträge in authors in einem zweiten Durchgang.

var authorsList = GetAuthorList();

var authors = authorsList.Where(a => a.FirstName == "Bob").ToList();

foreach (var author in authors)
{
    authorList.Remove(author);
}

24voto

CodeLikeBeaker Punkte 19490

Einfache Lösung:

static void Main()
{
    List<string> myList = new List<string> { "Jason", "Bob", "Frank", "Bob" };
    myList.RemoveAll(x => x == "Bob");

    foreach (string s in myList)
    {
        //
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X