2015-05-29 7 views
14

Ich habe zwei Listen, eine enthält URLs und eine andere, die alle MIME-Dateierweiterungen enthält. Ich möchte alle URLs, die auf solche Dateien verweisen, aus der ersten Liste entfernen.Wie entferne ich Elemente aus der generischen Liste, basierend auf mehreren Bedingungen und mit linq

Beispielcode:

List<string> urls = new List<string>(); 
urls.Add("http://stackoverflow.com/questions/ask"); 
urls.Add("http://stackoverflow.com/questions/dir/some.pdf"); 
urls.Add("http://stackoverflow.com/questions/dir/some.doc"); 

//total items in the second list are 190 
List<string> mime = new List<string>(); 
mime.Add(".pdf"); 
mime.Add(".doc"); 
mime.Add(".dms"); 
mime.Add(".dll"); 

Eine Möglichkeit, mehrere Elemente zu entfernen ist:

List<string> result = urls.Where(x => (!x.EndsWith(".pdf")) && (!x.EndsWith(".doc")) && (!x.EndsWith(".dll"))).ToList(); 

Allerdings gibt es mehr als 190 Erweiterungen in meiner zweiten Liste.

Die Frage - kann ich die Artikel aus der ersten Liste mit einem einzigen Liner entfernen oder nutzt eine foreach-Schleife die einzige Möglichkeit?

Antwort

15

Wenn Sie eine neue Liste erstellen möchten mit nur die Elemente Ihren Zustand übereinstimmt, gefunden

List<string> result = urls.Where(x => !mime.Any(y => x.EndsWith(y))).ToList(); 

Wenn Sie möchten, um tatsächlich Gegenstände von der Quelle zu entfernen, sollten Sie RemoveAll verwenden:

urls.RemoveAll(x => mime.Any(y => x.EndsWith(y))); 
+0

@AdamHouldsworth Autor verwendet den gleichen Ansatz denken sollte, wo er statt Entfernen von Elementen aus der Quelle eine neue Liste erstellt. Aber ja, habe meine Antwort mit dem tatsächlichen Entfernungscode aktualisiert. – MarcinJuraszek

+0

Ja, das ist in Ordnung, ich habe nur eine Erklärung für Passanten hinzugefügt :-) –

+2

'Any' Kurzschlüsse genau die gleiche Art und Weise' All' tut. http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs1173 – MarcinJuraszek

9

hier ist ein Einliner, der Ihre Bedürfnisse

urls.RemoveAll(x => mime.Any(y => x.EndsWith(y))); 

vielleicht ist dies ein sicherer appra oach

urls.RemoveAll(x => mime.Contains(Path.GetExtension(x))); 

Wenn Sie URLs wie http://stackoverflow.com/questions/dir/some.ashx?ID=.pdf Sie über einen anderen Ansatz bereits

Verwandte Themen