使用LINQ删除List <string>中存在属性的List <object>中的项目

时间:2019-03-12 15:52:43

标签: c# asp.net .net linq

这个问题与这个问题非常相似:Use LINQ to get items in one List<>, that are not in another List<>。但是这些差异足以使我难以确定LINQ语法。

我有两个列表:

List<Fubar> fewBarNew
List<string> existingProviderIDs

Fubar如下所示:

Class Fubar
{
    int FunbarId int {get; set;}
    ....
    ....
    string ProviderID {get; set;}
}

现在,我想从fewBarNew中删除FewBarNew.ProviderID内部存在existingProviderIDs的所有实例。

 fewBarNew = fewBarNew.Where(f => !existingProviderIdList.Any(ep => ?????).ToList();

1 个答案:

答案 0 :(得分:6)

通过Any,您可以检查集合中是否有任何项与某个谓词匹配。因此,您可以将谓词定义为“如果有任何项与当前项匹配”:

fewBarNew.Where(f => !existingProviderIdList.Any(ep => ep == f.ProviderID));

但是,我认为一种更清洁的方法是使用.Contains

var result = fewBarNew.Where(f => !existingProviderIDs.Contains(f.ProviderID));

然后,如在O(n^2)中执行的那样,您可以改用HashSet<string>来改进:

var existingProviderIDSet = new HashSet<string>(existingProviderIDs);
var result = fewBarNew.Where(f => !existingProviderIDSet.Contains(f.ProviderID));

HashSet的{​​{1}}执行Contains操作时,将在O(1)中执行。