2012-04-16 9 views
7

Welcher ist der einfachste Weg, um Elemente zu entfernen, die bestimmte Bedingung aus einer Liste und dann diese Elemente erhalten.LINQ: RemoveAll und Elemente entfernen

Ich kann in ein paar Möglichkeiten denken, ich weiß nicht, was das beste ist:

var subList = list.Where(x => x.Condition); 
list.RemoveAll(x => x.Condition); 

oder

var subList = list.Where(x => x.Condition); 
list.RemoveAll(x => subList.Contains(x)); 

Ist jede dieser eine der besten Möglichkeiten? Wenn es ist, welcher? Wenn nicht, wie soll ich das machen?

Antwort

4

Ich würde aus Gründen der Lesbarkeit mit der ersten Option gehen, mit dem Hinweis, dass Sie die Liste zuerst materialisieren sollten, oder Sie werden die sehr Gegenstände verlieren Sie versuchen, in der nächsten Zeile wählen:

var sublist = list.Where(x => x.Condition).ToArray(); 
list.RemoveAll(x => x.Condition); 

Das zweite Beispiel ist O (n^2) ohne Grund und das letzte ist völlig in Ordnung, aber weniger lesbar.

Edit: jetzt, dass ich Ihr letztes Beispiel neu gelesen habe, beachten Sie, dass, wie es jetzt geschrieben wird, jeden anderen Artikel herausnehmen wird. Sie vermissen die Bedingungsprüfung, und die Zeile zum Entfernen sollte eigentlich list.RemoveAt(i--); sein, weil das i+1 th-Element das i th-Element nach dem Entfernen wird, und wenn Sie i inkrementieren, überspringen Sie es.

+0

Es ist eigentlich O (n^3), aber ich gehe davon aus dem Fehlen von Materialisierung rutscht nur Ihre Meinung;) – Blindy

+0

Würden die Elemente (wie ich es geschrieben habe) mit der zweiten Anweisung aus der Unterliste entfernt? : O – Diego

+0

Sie entfernen nie aus 'sublist', noch haben Sie vor, wenn ich es richtig lese. – Blindy

2

Ich mag es, eine funktionale Programmierung Ansatz (nur neue Dinge machen, nicht vorhandene Dinge zu ändern). Ein Vorteil von ToLookup ist, dass Sie mehr als eine Zwei-Wege-Aufteilung der Elemente behandeln können.

ILookup<bool, Customer> lookup = list.ToLookup(x => x.Condition); 
List<Customer> sublist = lookup[true].ToList(); 
list = lookup[false].ToList(); 

oder wenn Sie die ursprüngliche Instanz ändern ...

list.Clear(); 
list.AddRange(lookup[false]); 
+0

Ich denke, es ist sehr komplex (und fast ohne Wissen, ich denke es ist nicht wirklich Leistung). Hat das irgendeinen Vorteil? – Diego

+0

Bedingung wird genau einmal pro Artikel ausgewertet.Die Listeninstanz wird nicht geändert, was ein großer Vorteil sein kann, wenn diese Listeninstanz unter Threads geteilt wird. –

Verwandte Themen