2015-05-29 14 views
14

Tôi có hai danh sách, một danh sách chứa các url và một danh sách khác, chứa tất cả các đuôi tệp MIME. Tôi muốn xóa khỏi danh sách đầu tiên tất cả các url trỏ đến các tệp đó.Làm cách nào để xóa các mục khỏi danh sách chung, dựa trên nhiều điều kiện và sử dụng linq

Mẫu mã:

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"); 

Một cách để loại bỏ nhiều mục là:

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

Tuy nhiên, có hơn 190 phần mở rộng trong danh sách thứ hai của tôi.

Câu hỏi - tôi có thể xóa các mục khỏi danh sách đầu tiên bằng một lớp lót hoặc đang sử dụng vòng lặp foreach theo cách duy nhất không?

Trả lời

15

Nếu bạn muốn tạo một danh sách mới chỉ với các mục phù hợp với điều kiện của bạn:

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

Nếu bạn muốn thực sự xoá các mục từ nguồn, bạn nên sử dụng RemoveAll:

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

@AdamHouldsworth Tác giả sử dụng phương pháp tương tự đã có, nơi ông tạo ra một danh sách mới thay vì xóa mục khỏi nguồn. Nhưng yeah, cập nhật câu trả lời của tôi với mã loại bỏ thực tế. – MarcinJuraszek

+0

Vâng, tôi chỉ cần thêm làm rõ cho người qua đường :-) –

+2

'Bất kỳ' mạch chính xác giống như cách 'Tất cả' làm. http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,1173 – MarcinJuraszek

9

đây là một lớp lót phù hợp với nhu cầu của bạn

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

có thể đây là đánh giá an toàn hơn oạch

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

Khi bạn có URL như http://stackoverflow.com/questions/dir/some.ashx?ID=.pdf bạn nên suy nghĩ về cách tiếp cận khác

Các vấn đề liên quan