var itemToRemove = resultlist.Single(r => r.Id==2);
resultList.Remove(itemToRemove);
Wenn Sie nicht sicher sind, ob das Element wirklich vorhanden ist, können Sie SingleOrDefault verwenden . SingleOrDefaultwird zurückgegeben, nullwenn kein Element vorhanden ist ( Singlelöst eine Ausnahme aus, wenn das Element nicht gefunden werden kann). Beide werfen, wenn es einen doppelten Wert gibt (zwei Elemente mit demselben id).
var itemToRemove = resultlist.SingleOrDefault(r => r.Id==2);if(itemToRemove !=null)
resultList.Remove(itemToRemove);
gut, als vielleichtvar itemsToRemove = resultlist.Where(r => r.Id == 2); foreach (var itemToRemove in ItemsToRemove) resultList.Remove(itemToRemove);
Vlad
1
Sollte das nicht sein resultlist.Items.RemoveAt(1);?
DreamTeK
48
Kurze Antwort: Entfernen (aus der Liste results)
results.RemoveAll(r => r.ID == 2);entfernt den Artikel mit der ID 2 in results(an Ort und Stelle).
Filter (ohne aus der ursprünglichen Liste zu entfernen results):
var filtered = result.Where(f => f.ID != 2);Gibt alle Elemente außer dem mit der ID 2 zurück
Detaillierte Antwort:
Ich denke, es .RemoveAll()ist sehr flexibel, da Sie eine Liste von Artikel-IDs haben können, die Sie entfernen möchten - beachten Sie bitte das folgende Beispiel.
Wenn Sie haben:
class myClass {publicint ID;publicstringFirstName;publicstringLastName;}
und wies einige Werte resultswie folgt zu:
var results=newList<myClass>{new myClass(){ ID=1,FirstName="Bill",LastName="Smith"},new myClass(){ ID=2,FirstName="John",LastName="Wilson"},new myClass(){ ID=3,FirstName="Doug",LastName="Berg"},new myClass(){ ID=4,FirstName="Bill",LastName="Wilson"},};
Anschließend können Sie eine Liste der zu entfernenden IDs definieren:
var removeList =newList<int>(){2,3};
Und verwenden Sie dies einfach, um sie zu entfernen:
Es werden die Elemente 2 und 3 entfernt und die Elemente 1 und 4 beibehalten - wie in der Tabelle angegeben removeList. Beachten Sie, dass dies an Ort und Stelle geschieht, sodass keine zusätzliche Zuordnung erforderlich ist.
Natürlich können Sie es auch für einzelne Elemente verwenden, z.
results.RemoveAll(r => r.ID==4);
In unserem Beispiel wird Bill mit der ID 4 entfernt.
Ein anderer ähnlicher Ansatz (der ein Prädikat verwendet) ist die Verwendung von List.FindIndex/ List.RemoteAt(das die Funktion "nett" oder "nicht so nett" hat, eine mutierende Operation zu sein).
Das stimmt, aber vorsichtig sein , zu sagen , dass List Betrieb ist mutiert. List verwendet ein Array hinter den Kulissen und kann sein Array mit einer kleineren oder größeren Kapazität neu erstellen, wenn es dies für erforderlich hält. Normalerweise ist das Entfernen eine In-Place-Mutation des vorhandenen Arrays.
KeithS
Dies ist nicht threadsicher, und für seine Einfachheit können Sie nur SingleOrDefault verwenden, es muss nicht in einer statischen Methode enthalten sein
Niemand sagte, es sei threadsicher (und ob dies davon abhängt, was die Threads tun sollen; es kann tatsächlich vorzuziehen sein, einem Arbeitsthread ein anderes In-Memory-Konstrukt zuzuweisen, als sie alle an einer gleichzeitigen Sammlung arbeiten zu lassen ), und das OP möchte alle Datensätze außer dem, der dem Prädikat entspricht, sodass SingleOrDefault tatsächlich genau das zurückgibt, was sie nicht möchten. Die "statische Methode" ist in der Tat eine Erweiterungsmethode, wie die meisten von Linq, und funktioniert immer dann, wenn das, was Sie nicht wollen (ein oder mehrere Elemente), einfacher zu definieren ist als das, was Sie tun.
KeithS
5
Es gibt einen anderen Ansatz. Es verwendetList.FindIndex und List.RemoveAt.
Während ich wahrscheinlich die von KeithS vorgestellte Lösung verwenden würde (nur das einfache Where/ ToList), unterscheidet sich dieser Ansatz darin das ursprüngliche mutiert . Dies kann je nach Erwartungen eine gute (oder eine schlechte) "Eigenschaft" sein.
In jedem Fall stellt das FindIndex(in Verbindung mit einem Schutz) sicher RemoveAt, dass das korrekt ist, wenn es Lücken in den IDs gibt oder die Reihenfolge falsch ist usw. und die Verwendung von RemoveAt(vs Remove) a vermeidet zweite O (n) -Suche in der Liste.
var itemsToRemove = resultlist.Where(r => r.Id == 2); foreach (var itemToRemove in ItemsToRemove) resultList.Remove(itemToRemove);
resultlist.Items.RemoveAt(1);
?Kurze Antwort:
Entfernen (aus der Liste
results
)results.RemoveAll(r => r.ID == 2);
entfernt den Artikel mit der ID 2 inresults
(an Ort und Stelle).Filter (ohne aus der ursprünglichen Liste zu entfernen
results
):var filtered = result.Where(f => f.ID != 2);
Gibt alle Elemente außer dem mit der ID 2 zurückDetaillierte Antwort:
Ich denke, es
.RemoveAll()
ist sehr flexibel, da Sie eine Liste von Artikel-IDs haben können, die Sie entfernen möchten - beachten Sie bitte das folgende Beispiel.Wenn Sie haben:
und wies einige Werte
results
wie folgt zu:Anschließend können Sie eine Liste der zu entfernenden IDs definieren:
Und verwenden Sie dies einfach, um sie zu entfernen:
results.RemoveAll(r => removeList.Any(a => a==r.ID));
Es werden die Elemente 2 und 3 entfernt und die Elemente 1 und 4 beibehalten - wie in der Tabelle angegeben
removeList
. Beachten Sie, dass dies an Ort und Stelle geschieht, sodass keine zusätzliche Zuordnung erforderlich ist.Natürlich können Sie es auch für einzelne Elemente verwenden, z.
In unserem Beispiel wird Bill mit der ID 4 entfernt.
DotNetFiddle: Führen Sie die Demo aus
quelle
Ich mag einen kleinen Linq-Helfer, der einfach zu implementieren ist und Abfragen mit "wo nicht" -Bedingungen etwas einfacher zu lesen macht:
quelle
List.FindIndex
/List.RemoteAt
(das die Funktion "nett" oder "nicht so nett" hat, eine mutierende Operation zu sein).Es gibt einen anderen Ansatz. Es verwendet
List.FindIndex
undList.RemoveAt
.Während ich wahrscheinlich die von KeithS vorgestellte Lösung verwenden würde (nur das einfache
Where
/ToList
), unterscheidet sich dieser Ansatz darin das ursprüngliche mutiert . Dies kann je nach Erwartungen eine gute (oder eine schlechte) "Eigenschaft" sein.In jedem Fall stellt das
FindIndex
(in Verbindung mit einem Schutz) sicherRemoveAt
, dass das korrekt ist, wenn es Lücken in den IDs gibt oder die Reihenfolge falsch ist usw. und die Verwendung vonRemoveAt
(vsRemove
) a vermeidet zweite O (n) -Suche in der Liste.Hier ist ein LINQPad- Snippet:
Viel Spaß beim Codieren.
quelle
Sie geben nicht an, welche Art von Liste, aber die generische Liste kann entweder die
RemoveAt(index)
Methode oder dieRemove(obj)
Methode verwenden:quelle
Einfacher:
Es ist nicht erforderlich, ein neues var-Objekt zu erstellen.
quelle
... oder nur
resultlist.RemoveAt(1)
wenn Sie den Index genau kennen.quelle
quelle