优化代码 - 全部()。包含

时间:2015-09-23 15:04:41

标签: c# linq contains

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

return proIds.All(result.Contains);

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

4 个答案:

答案 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();