var result = this.context.Pro.Where(p => p.Supplier.Active).Select(p => p.id).ToList();
return proIds.All(result.Contains);
这确实有效,只是想知道是否有更好的方法。 proIds
需要包含在专业版中。
答案 0 :(得分:7)
以下是使用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);
答案 1 :(得分:5)
List.Contains
是一个O(n)操作,因此最好创建一个HashSet
,其Contains
操作为O(1)。我假设您的ID适合存储在哈希集中。
答案 2 :(得分:1)
您可以使用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>
搜索操作(Contains
调用中的proIds.All(result.Contains);
方法)具有恒定的算法复杂度O(1);
答案 3 :(得分:-1)
假设您有一个数组或ID列表,并且您想要选择具有匹配ID的行:
int[] ids = {1,2,3} // ID's to search for
return this.context.Pro.Where(x => x.Supplier.Active && ids.Contains(x)).ToList();