Angenommen, ich habe eine LINQ-Abfrage wie:
var authors = from x in authorsList
where x.firstname == "Bob"
select x;
Da authorsList
ist der Typ List<Author>
, wie kann ich die löschen Author
Elemente aus , authorsList
die von der Abfrage in zurückgegeben werden authors
?
Oder anders ausgedrückt: Wie kann ich alle Vornamen löschen, die Bob entsprechen authorsList
?
Hinweis: Dies ist ein vereinfachtes Beispiel für die Zwecke der Frage.
Contains
Prüfung schnell und stellt sicher, dass Sie die Sequenz nur einmal auswerten.List<T>
, ist es in Ordnung, sie zu verwenden.authorsList = authorsList.Where(x => x.FirstName != "Bob")
Es ist besser, List <T> .RemoveAll zu verwenden, um dies zu erreichen.
quelle
Wenn Sie wirklich Elemente entfernen müssen, was ist dann mit Except ()?
Sie können basierend auf einer neuen Liste entfernen oder im laufenden Betrieb entfernen, indem Sie den Linq verschachteln.
quelle
Except()
ist der einzige Weg, um in der Mitte der LINQ-Anweisung zu gehen.IEnumerable
hat nochRemove()
nichtRemoveAll()
.Sie können dies nicht mit Standard-LINQ-Operatoren tun, da LINQ Abfrage und keine Aktualisierungsunterstützung bietet.
Sie können jedoch eine neue Liste erstellen und die alte ersetzen.
Oder Sie können alle Elemente
authors
in einem zweiten Durchgang entfernen .quelle
RemoveAll()
ist kein LINQ-Operator.Remove
ist auch eineList
<T
> -Methode, keine System.Linq.Enumerable- Methode.Einfache Lösung:
quelle
Ich habe mich gefragt, ob es einen Unterschied zwischen
RemoveAll
undExcept
und den Profis der Verwendung gibtHashSet
, also habe ich eine schnelle Leistungsprüfung durchgeführt :)Ergebnisse unten:
Wie wir sehen können, ist die beste Option in diesem Fall die Verwendung
RemoveAll(HashSet)
quelle
l2.RemoveAll( new HashSet<string>( toRemove ).Contains );
kompiliert gut nur FYIDies ist eine sehr alte Frage, aber ich habe einen wirklich einfachen Weg gefunden, dies zu tun:
Beachten Sie, dass , da die Rückgabevariable
authorsList
a istList<T>
, dieIEnumerable<T>
zurück durchExcept()
muss ein umgewandelt werdenList<T>
.quelle
Sie können auf zwei Arten entfernen
oder
Ich hatte das gleiche Problem: Wenn Sie eine einfache Ausgabe basierend auf Ihrem Where-Zustand wünschen, ist die erste Lösung besser.
quelle
Sagen Sie, dass
authorsToRemove
eine istIEnumerable<T>
, die die Elemente enthält , aus denen Sie entfernen möchtenauthorsList
.Dann ist hier ein weiterer sehr einfacher Weg, um die vom OP angeforderte Entfernungsaufgabe zu erfüllen:
quelle
Ich denke, Sie könnten so etwas tun
Obwohl ich denke, dass die bereits gegebenen Lösungen das Problem besser lesbar lösen.
quelle
Unten sehen Sie das Beispiel, um das Element aus der Liste zu entfernen.
quelle
LINQ hat seinen Ursprung in der funktionalen Programmierung, bei der die Unveränderlichkeit von Objekten im Vordergrund steht. Daher bietet es keine integrierte Möglichkeit, die ursprüngliche Liste direkt zu aktualisieren.
Hinweis zur Unveränderlichkeit (entnommen aus einer anderen SO-Antwort):
Hier ist die Definition der Unveränderlichkeit aus Wikipedia .
quelle
Ich denke, Sie müssen nur die Elemente aus der Autorenliste einer neuen Liste zuweisen, um diesen Effekt zu erzielen.
quelle
Um den Code flüssig zu halten (wenn die Codeoptimierung nicht entscheidend ist) und Sie einige weitere Vorgänge in der Liste ausführen müssen:
oder
quelle