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);
}

HashSet 和 IEnumerables 的执行

不,查询仅在从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);
    }
}

因此,查询仅执行一次。