IEnumerable<char> query = "Not what you might expect";
foreach (char vowel in "aeiou")
{
char temp = vowel;
query = query.Where (c => c != temp);
}
query.Dump ("The workaround");
IEnumerable<char> query = "Not what you might expect";
foreach (char vowel in "aeiou")
{
query = query.Where (c => c != vowel);
}
new string (query.ToArray()).Dump ("Notice that only the 'u' is stripped!");
前面两个查询为什么结果会不一样,一直没弄明白。
为什么第一个循环里加了个变量后就不一样了呢。
希望高手解惑。
这是LinqPad里的例子。
你好,这个问题是这样的。
首先你应该理解Linq的迟绑定的原理,因为你不理解这个,你的例子的区别你将无法解答。
所谓linq的迟绑定,就是你的linq语句的执行是在query.ToArray()中执行的。
还有,你应该明白扩展方法中变量的声明周期。
好了,如果你明白了上面所说的,接下来我们来看你的第一个和第二个的区别:
第一个:
IEnumerable<char> query1 = "Not what you might expect";
var result = query1.Where(c => c != 'a');
result = query1.Where(c => c != 'e');
result = query1.Where(c => c != 'i');
result = query1.Where(c => c != 'o');
result = query1.Where(c => c != 'u');
第二个:
IEnumerable<char> query2 = "Not what you might expect";
query2 = query2.Where(c => c != 'u');
query2 = query2.Where(c => c != 'u');
query2 = query2.Where(c => c != 'u');
query2 = query2.Where(c => c != 'u');
query2 = query2.Where(c => c != 'u');
希望能帮助你。
其实最终是个传值和传地址的问题,只了解表面现象倒也不是问题……