C# 使用LINQ删除列表中的项目<;对象>;如果列表中存在属性<;字符串>;

C# 使用LINQ删除列表中的项目<;对象>;如果列表中存在属性<;字符串>;,c#,asp.net,.net,linq,C#,Asp.net,.net,Linq,这个问题和这个很相似:。但是这些差异足以让我难以确定LINQ语法 我有两份清单: List<Fubar> fewBarNew List<string> existingProviderIDs 现在,我想从fewBarNew中删除fewBarNew.ProviderID存在于现有providerids中的任何实例 fewBarNew = fewBarNew.Where(f => !existingProviderIdList.Any(ep => ?????)

这个问题和这个很相似:。但是这些差异足以让我难以确定LINQ语法

我有两份清单:

List<Fubar> fewBarNew
List<string> existingProviderIDs
现在,我想从
fewBarNew
中删除
fewBarNew.ProviderID
存在于
现有providerids
中的任何实例

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

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

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

var result = fewBarNew.Where(f => !existingProviderIDs.Contains(f.ProviderID));
然后,当这在
O(n^2)
中执行时,您可以使用
哈希集来改进:

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

由于
HashSet
包含
执行
O(1)
操作,这将在
O(n)

中执行,因为您要比较ProviderID,
f.ProviderID==ep
@RangoLINQ@PanagiotisKanavos它使用哪种LINQ方法?@Servy Enumerable.Contains?@Rango,区别是?O(n^2)无论哪种方式,都是完全枚举。除了答案之外,还感谢您提供的有关性能的提示@吉拉德格林:我一直在做
。Where
这件事;但是我从来没有做过HashSet。虽然我知道
.Contains
是O(n),但我不认为这会抵消创建HashSet的成本(时间和资源消耗),因为您已经有了列表。我误解了吗?或者你只是在暗示哈希集从一开始就是一个更好的选择?@Clay-它非常依赖于大小写。我有一份约20万件物品的清单,还有一件物品也相当大。在这种情况下,创建哈希集并使用它是非常值得的。最好是创建一个场景,在这样的场景中,用不同数量的项目填充两个列表,并绘制执行时间。然后,您将看到与中的附加值相比,创建hashset的开销有多大performance@Clay
O(N)
是单个
列表的成本。包含
调用。当您对其他列表中的每个项目执行
包含
时,成本为
O(N^2)
。不过是O(1)。在某些情况下,重复的
List.Contains
调用的成本将大于创建哈希集的初始成本
var result = fewBarNew.Where(f => !existingProviderIDs.Contains(f.ProviderID));
var existingProviderIDSet = new HashSet<string>(existingProviderIDs);
var result = fewBarNew.Where(f => !existingProviderIDSet.Contains(f.ProviderID));