Linq Contains() 是否检查 HashSet?

27 浏览
0 Comments

Linq Contains() 是否检查 HashSet?

有时候,一个 HashSet 会以 IEnumerable 的形式通过属性进行暴露。

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

在使用 Linq 版本的 enumerable.Contains(x) 和 HashSets 时,是否有类似的检查机制?

admin 更改状态以发布 2023年5月20日
0
0 Comments

值得注意的是,有文档记录,需要寻找 ICollection(见备注)。

0
0 Comments

参考源码可以看出,它确实可以这么做, 但并不是直接的方式:

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

如果源枚举实现了ICollection接口(如HashSet),则使用该集合的Contains方法。

0