如何根据多个条件并使用 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 从通用列表中删除项目的主要内容,如果未能解决你的问题,请参考以下文章