代码演示 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();
}
谢谢浏览!
作者:音乐让我说(音乐让我说 - 博客园)
出处:http://music.cnblogs.com/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
浙公网安备 33010602011771号