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

我有两个列表,一个包含 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 循环的唯一方法?

【问题讨论】:

    标签: c# linq list lambda


    【解决方案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://stackoverflow.com/questions/dir/some.ashx?ID=.pdf 这样的网址时,您应该考虑另一种方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多