Как удалить элементы из общего списка на основе нескольких условий и использовать linq

У меня есть два списка: один содержит URL-адреса и другой, содержащий все расширения MIME файлов. Я хочу удалить из первого списка все URL-адреса, указывающие на такие файлы.

Пример кода:

List<string> urls = new List<string>();
urls.Add("http://stackoverflow.com/info/ask");
urls.Add("http://stackoverflow.com/info/dir/some.pdf");
urls.Add("http://stackoverflow.com/info/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"); 

Один способ удаления нескольких элементов:

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

Однако во втором списке есть более 190 расширений.

Вопрос: могу ли я удалить элементы из первого списка с одним лайнером или использовать цикл foreach единственным способом?

Ответы

Ответ 1

Если вы хотите создать новый список только с элементами, соответствующими вашему условию:

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

Если вы хотите удалить элементы из исходного кода, вы должны использовать RemoveAll:

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

Ответ 2

вот один лайнер, который соответствует вашим потребностям

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

возможно, это более безопасный аттестат

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

Когда у вас есть URL-адреса, такие как http://stackoverflow.com/info/dir/some.ashx?ID=.pdf, вы должны подумать о другом подходе