首页 新闻 会员 周边

linq延迟执行问题

0
悬赏园豆:10 [已解决问题] 解决于 2015-11-20 17:24
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



IEnumerable<char> query = "How are you, friend.";

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  
 
浅言的主页 浅言 | 初学一级 | 园豆:195
提问于:2015-07-23 11:47
< >
分享
最佳答案
0

懂了就好,那我就不说了。

LINQ在For each里面使用时,一定要注意使用第二种写法,否则很容易出错的。

收获园豆:8
爱编程的大叔 | 高人七级 |园豆:30839 | 2015-07-24 09:44

我复制LZ的代码.2段都是一样的结果..请教大叔不一致的结果是为何..

SoloSANG | 园豆:4 (初学一级) | 2015-07-27 18:32

@SoloSANG: 我试了一下,也是一样的,要么被题主骗了,要么就是VS编译器不同造成的。

再次进行测试,发现结果如下

VS2010,运行结果如题主。

VS2013,运行结果一样。

其他版本VS没有测试过。

 

可能微软意识到LINQ延期编译造成的这个问题,在新版本编译器中进行了修正吧。

 

以前一直都是用的VS2010 + LINQ,题主所说这个问题确实是需要注意使用第二种写法的。

否则编译器是将var vowel 全部用最后一个u代入linq语法中。

这个可以理解为LINQ编译器的BUG,所以微软做了修改。

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-07-28 10:51

@SoloSANG: 你确定2段代码跑出来的是一样的,再说我干嘛骗你啊

浅言 | 园豆:195 (初学一级) | 2015-07-28 17:31

@爱编程的大叔: 我用的是10

浅言 | 园豆:195 (初学一级) | 2015-07-28 17:33

难道13里面的linq不是延迟执行了?大叔考证下告知,谢谢

浅言 | 园豆:195 (初学一级) | 2015-07-28 17:35

@浅言: 我说了这个是延时编译,你可以认为是个BUG,也可以认为不是。

微软意识到这个问题后,在ExpressionVisitor里面做了修正,就可以避免你麻烦了。

VS2010确实是第一种方式,VS2013是第二种方式,我测试过了。

 

延时编译在For each 结构中,出现的问题就是

for each var obj in list

  var query = from c in table

                          where (condition contains(obj))

     // 类似这种结构, 假设LIST里面有5个obj,

      //query使用的全部是最后一个obj。

     // 通过 var temp=obj; 

     // var query = from c in table where (condition contains(temp));

     // 可以避免LINQ延时编译带来的问题。

next for 

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-07-28 17:37

@浅言:  VS 2012 . 反复观察过. 结果都是一致的. 可能真的是像大叔说的那样.

SoloSANG | 园豆:4 (初学一级) | 2015-07-28 18:39
其他回答(1)
0

对你输出的结果有点怀疑,你别骗我哦,延时加载不会影响你执行的结果的,例如,您可能需要查看客户数据和订单数据。你最初不一定需要检索与每个客户有关的所有订单数据。其优点是你可以使用Linq延迟加载将额外信息的检索操作延迟到你确实需要检索它们时再进行

收获园豆:2
稳稳的河 | 园豆:4216 (老鸟四级) | 2015-07-23 13:25

结果是千真万确的,不会有错的

支持(0) 反对(0) 浅言 | 园豆:195 (初学一级) | 2015-07-23 13:37

@浅言: 可是你上下的2段代码毫无差别呀,后面的就是用了一个char的去接收了,与延迟加载没关系,你再运行下

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-07-23 14:38

@稳稳的河: 嘿嘿,代码是没问题的,就那一点差别,结果确实不一样的,精华就在这,我们公司大神已经给我说通了,有时间我整整发出来。

支持(0) 反对(0) 浅言 | 园豆:195 (初学一级) | 2015-07-23 15:07

嗯,有时间请教下,难道由于延时加载引起了线程安全?还是其他什么原因

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-07-24 17:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册