代码改变世界

代码演示 Linq 延迟执行(Deferred Execution) 带来的问题

2011-12-15 16:34  音乐让我说  阅读(259)  评论(0)    收藏  举报

直接贴代码:

        static void Main(string[] args)
{
IEnumerable<char> query = "How are you, friend.";

//我们的目的是去除元音字母

foreach (char vowel in "aeiou")
{
query = query.Where(c => c != vowel);
}

foreach (char c in query)
{
Console.Write(c); //结果:How are yo, friend.
}
Console.WriteLine();

//结果中只有字母u被过滤了,咋一看,有没有吃一惊呢!
//但只要仔细一想就能知道原因:因为vowel定义在循环之外,所以每个lambda表达式都捕获了同一变量。
//当我们的query执行时,vowel的值是什么呢?不正是被过滤的字母u嘛。
//要解决这个问题,我们只需把循环变量赋值给一个内部变量即可,
//如下面的temp变量作用域只是当前的lambda表达式。

foreach (char vowel in "aeiou")
{
char temp = vowel;
query = query.Where(c => c != temp);
}

foreach (char c in query)
{
Console.Write(c); //结果:Hw r y, frnd.
}
Console.WriteLine();
}

 

谢谢浏览!