【问题标题】:Does Linq Contains() check for HashSet?Linq Contains() 是否检查 HashSet?
【发布时间】:2014-08-12 22:22:27
【问题描述】:

有时 HashSet 通过属性公开为 IEnumerable。

众所周知,对于enumerable.Count(),代码会检查它是否是一个集合,因此它不会枚举整个列表,而是采用捷径。

对于使用enumerable.Contains(x) 和 HashSets 的 Linq 版本是否有类似的检查?

【问题讨论】:

  • Count() 的快捷方式是一个属性。属性如何正确返回动态表达式的布尔值?
  • 你到底是什么意思?....如果在查询中调用 contains(x) 只会检查列表的一部分?
  • @TravisJ 他的意思是Enumerable.Count() 检查对象是否为ICollection 类型,如果是则返回ICollection.Count 作为优化。如果不是,则必须枚举可枚举项才能计算项目。
  • @cdhowie - 是的,我理解这方面,但这与 Contains 有什么关系?

标签: c# linq hashset


【解决方案1】:

来自reference source,是的,虽然不是直接的:

public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value) {
    ICollection<TSource> collection = source as ICollection<TSource>;
    if (collection != null) return collection.Contains(value);
    return Contains<TSource>(source, value, null);
}

如果源枚举实现了ICollection&lt;T&gt;(并且HashSet&lt;T&gt; 实现了),那么它使用集合的Contains 方法。

【讨论】:

  • +1 但我要指出它检查HashSet&lt;T&gt; 特别(因为这是被问到的问题)但是它将检查ICollection&lt;T&gt;,因此无需具备HashSet&lt;T&gt; 的专业知识即可完成相同的操作。
【解决方案2】:

还要注意寻找ICollection&lt;T&gt;documented(参见备注)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-06
    • 2021-04-03
    • 2013-05-15
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多