【问题标题】:Optimise code - All() .Contains优化代码 - All() .Contains
【发布时间】:2025-11-23 22:05:02
【问题描述】:
var result = this.context.Pro.Where(p => p.Supplier.Active).Select(p => p.id).ToList();

return proIds.All(result.Contains);

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

【问题讨论】:

  • 它是如何构建的?包含是一个方法
  • @Sam 隐式方法组转换。它会构建得很好。
  • proid 是产品列表。 result 也是一个产品列表。我需要确保所有 proid 都在结果列表中(都有活跃的供应商)
  • @CharlesMager 哇哦。谢谢,我会查的。
  • @Sam,我在 * 上找到了它,并认为“我会拥有它”

标签: c# linq contains


【解决方案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);

【讨论】:

  • 实际上我认为你可能有错误的方式。不应该是return !proIds.Except(activeIDs).Any(); 吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】: