LINQ中的 Deffered Execution

LINQ的延迟执行:


 1 
 2 IEnumerable<char> query = "Not what you might expect";
 3 foreach (char vowel in "aeiou")
 4     {
 5              query = query.Where (c => c != vowel);
 6          }
 7 
 8 //query结果为字符串"Not what yo might expect"
 9 
10 
11 IEnumerable<char> query = "Not what you might expect";
12 foreach (char vowel in "aeiou")
13     {
14              char temp=vowel;
15              query = query.Where (c => c != temp);
16          }
17 
18 
19 
20 //query结果为"Nt wht y mght xpct"


为什么会这样,因为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 ' );

你可能感兴趣的:(LINQ)