LINQ的延迟执行:
为什么会这样,因为IEnumberable的Where方法是延迟执行的:
此方法通过使用延迟执行实现。即时返回值为一个对象,该对象存储执行操作所需的所有信息。只有通过直接调用对象的 GetEnumerator 方法或使用 Visual C# 中的 foreach(或 Visual Basic 中的 For Each)来枚举该对象时,才执行此方法表示的查询。
因此第一个例子中,Where中保存了一个vowel的引用,当执行查询的时候,foreach已经执行完,此时vowel的值为‘u’,故有此结果。
第2个例子中,Where保存的是temp的引用,可是因为foreach每次循环都会声明temp并赋值,因此实际有5个temp的值被保存,当foreach执行完之后,再调用其他能触发查询的方法便得到的是如上结果。相当于委托链有5个方法并以此执行:
为什么会这样,因为IEnumberable的Where方法是延迟执行的:
此方法通过使用延迟执行实现。即时返回值为一个对象,该对象存储执行操作所需的所有信息。只有通过直接调用对象的 GetEnumerator 方法或使用 Visual C# 中的 foreach(或 Visual Basic 中的 For Each)来枚举该对象时,才执行此方法表示的查询。
因此第一个例子中,Where中保存了一个vowel的引用,当执行查询的时候,foreach已经执行完,此时vowel的值为‘u’,故有此结果。
第2个例子中,Where保存的是temp的引用,可是因为foreach每次循环都会声明temp并赋值,因此实际有5个temp的值被保存,当foreach执行完之后,再调用其他能触发查询的方法便得到的是如上结果。相当于委托链有5个方法并以此执行:
1 query = query.Where (c => c != 'a');
2 query = query.Where (c => c != 'e');
3 query = query.Where (c => c != 'i');
4 query = query.Where (c => c != 'o');
5 query = query.Where (c => c != 'u');
2 query = query.Where (c => c != 'e');
3 query = query.Where (c => c != 'i');
4 query = query.Where (c => c != 'o');
5 query = query.Where (c => c != 'u');