HashSet 和 IEnumerables 的执行
本文关键字:执行 IEnumerables HashSet | 更新日期: 2023-09-27 18:29:08
当
HashSet需要时,HashSet是否总是执行未执行的ienumerable?
例如:
list = new List { 1 ..... 1000);
var linq = list.Where(x => x > 10);
var hashSet = new HashSet(linq);
现在,当我在for loop
中调用hashSet.Contains(7)
时,hashSet
是否总是在需要时执行 Where 语句?
for(int i = 0; i < 10000; ..)
{
hashSet.Contains(7);
}
不,查询仅在从IEnumerable<T>
生成HashSet
时执行(构造函数枚举它以填充集合(,因此之后不会执行查询。
正如您在HashSet<T>
构造函数中看到的那样
// this is the constructor you are using
public HashSet(IEnumerable<T> collection)
: this(collection, EqualityComparer<T>.Default) { }
public HashSet(IEnumerable<T> collection, IEqualityComparer<T> comparer)
: this(comparer) {
...
// removed unnecessary parts...
this.UnionWith(collection);
...
}
它使用给定IEnumerable<T>
调用UnionWith
方法,该方法遍历项目并添加它们(如果它们尚不存在(
public void UnionWith(IEnumerable<T> other)
{
...
foreach (T item in other)
{
AddIfNotPresent(item);
}
}
因此,查询仅执行一次。