如何根据多个条件并使用 linq 从通用列表中删除项目

Posted

技术标签:

【中文标题】如何根据多个条件并使用 linq 从通用列表中删除项目【英文标题】:How do I remove items from generic list, based on multiple conditions and using linq 【发布时间】:2015-08-11 22:08:27 【问题描述】:

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

示例代码:

List<string> urls = new List<string>();
urls.Add("http://***.com/questions/ask");
urls.Add("http://***.com/questions/dir/some.pdf");
urls.Add("http://***.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 循环的唯一方法?

【问题讨论】:

【参考方案1】:

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

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

如果你想真正从源中删除项目,你应该使用RemoveAll

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

【讨论】:

@AdamHouldsworth 作者已经使用了相同的方法,他创建了一个新列表,而不是从源中删除项目。但是,是的,用实际的删除代码更新了我的答案。 是的,没关系,我只是为路人添加说明:-) Any 短路的方式与All 完全相同。 referencesource.microsoft.com/#System.Core/System/Linq/… 也许,我周五早上大脑中的逻辑还没有完全弄清楚。我需要通过 ReSharper 进行确认,哈哈,顺便说一句,不错的链接,自从我上次查看它以来,它已经改变了。【参考方案2】:

这里有一个满足您需求的衬垫

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

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

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

当您拥有像 http://***.com/questions/dir/some.ashx?ID=.pdf 这样的网址时,您应该考虑另一种方法

【讨论】:

以上是关于如何根据多个条件并使用 linq 从通用列表中删除项目的主要内容,如果未能解决你的问题,请参考以下文章

使用 Linq 根据条件过滤对象列表

从条件父ID和子ID linq C#的列表中删除

迭代时如何从通用列表中删除元素?

c#在遍历列表时删除元素-向后迭代或使用i--或使用linq同时迭代和删除?

LINQ:RemoveAll 并删除元素

根据条件从 spark 数据框中删除行