如何从通用列表中删除项目,基于多个条件,并使用linq

本文关键字:于多个 条件 linq 删除项目 列表 | 更新日期: 2023-09-27 17:51:07

我有两个列表,一个包含url,另一个包含所有MIME文件扩展名。我想从第一个列表中删除所有指向这些文件的url。

示例代码:

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

删除多个条目的一种方法是:

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

然而,在我的第二个列表中有超过190个扩展。

问题-我可以用一行代码从第一个列表中删除项目还是使用foreach循环是唯一的方法?

如何从通用列表中删除项目,基于多个条件,并使用linq

如果您想创建一个只包含符合条件的项目的新列表:

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

如果你想从源代码中删除项目,你应该使用RemoveAll:

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

这里有一个适合您需要的一行

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

也许这是一个更安全的方法

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

当你有像http://stackoverflow.com/questions/dir/some.ashx?ID=.pdf这样的url时你应该考虑另一种方法