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

Cas*_*ton 0 .net c# linq asp.net

这个问题与以下问题非常相似: 使用LINQ可以在一个List <>中获得项目,而不在另一个List <>中。但是这些差异足以使我难以确定LINQ语法。

我有两个清单:

List<Fubar> fewBarNew
List<string> existingProviderIDs
Run Code Online (Sandbox Code Playgroud)

其中Fubar的样子:

Class Fubar
{
    int FunbarId int {get; set;}
    ....
    ....
    string ProviderID {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

现在,我要从fewBarNewFewBarNew.ProviderID存在的任何实例中删除existingProviderIDs

 fewBarNew = fewBarNew.Where(f => !existingProviderIdList.Any(ep => ?????).ToList();
Run Code Online (Sandbox Code Playgroud)

Gil*_*een 6

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

fewBarNew.Where(f => !existingProviderIdList.Any(ep => ep == f.ProviderID));
Run Code Online (Sandbox Code Playgroud)

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

var result = fewBarNew.Where(f => !existingProviderIDs.Contains(f.ProviderID));
Run Code Online (Sandbox Code Playgroud)

然后,随着此过程的进行,O(n^2)您可以改用a HashSet<string>来改进:

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

HashSetContains执行的O(1)操作,这将执行O(n)