有人可以解释为什么下面的C#行与下面的foeach块的行为不一样吗?
string [] strs = {"asdf", "asd2", "asdf2"};
strs.Select(str => doSomething(str));
foreach(string str in strs){
doSomething(str);
}
我在doSomething()中放置一个断点,它不会在Select中触发,但它与foreach一起触发。
TIA
答案 0 :(得分:10)
这是因为LINQ查询是延迟的。传递给Select
方法的lambda实际上是在访问结果时执行的。
尝试:
string [] strs = {"asdf", "asd2", "asdf2"};
var result = strs.Select(str => doSomething(str));
foreach(var item in result) {
}
答案 1 :(得分:1)
Linq
查询只有在您使用Enumarable
,ToList()
等将其转换为ToArray()
后才会被处理。
顺便说一下,你foreach
语句的等价物是这样的:
<击> 撞击>
<击>strs.ForEach(doSomething);击>
<击> 撞击>
strs.ToList().ForEach(doSomething);
或
Array.ForEach(strs, doSomething);
答案 2 :(得分:1)
你需要做类似
的事情string [] strs = {"asdf", "asd2", "asdf2"};
strs = strs.Select(str => doSomething(str)).ToArray();
foreach(string str in strs){
doSomething(str);
}
答案 3 :(得分:0)
我认为一旦你使用select中返回的值,你会看到doSomething()被调用。查看yield,看看为什么会发生这种情况。