Как удалить элементы из общего списка на основе нескольких условий и использовать 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
, вы должны подумать о другом подходе