优化代码 - All() .Contains

Optimise code - All() .Contains

var result = this.context.Pro.Where(p => p.Supplier.Active).Select(p => p.id).ToList();

return proIds.All(result.Contains);

这确实有效,只是想知道是否有更好的方法。 proIds 需要包含在 Pro 中。

List.Contains是一个O(n)操作,所以最好创建一个HashSet,它的Contains操作是O(1)。我假设您的 ID 适合存储在哈希集中。

您可以使用 HashSet<int> 来存储您的 ID(假设您的 ID 属于 int 类型)并且它的构造函数 public HashSet(IEnumerable<T> collection) 如下所示: var result = new HashSet<int>(this.context.Pro.Where(p => p.Supplier.Active).Select(p => p.id)); 现在当您有 HashSet<int> 时,搜索操作(您的 proIds.All(result.Contains); 调用中的 Contains 方法)具有恒定的算法复杂度 O(1);

这是一个使用集合的 Except 的更高效的版本:

var activeIDs = this.context.Pro.Where(p => p.Supplier.Active).Select(p => p.id);
return !proIds.Except(activeIDs).Any(); 

另一种方法是使用 HashSet + All:

var activeIDSet = new HashSet<int>(context.Pro.Where(p => p.Supplier.Active).Select(p => p.id));
return proIds.All(activeIDSet.Contains);