这个问题与这个问题非常相似: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();
答案 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)
中执行。