优化代码 - 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);
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);