IEnumerable选择

dha*_*rga 6 c# linq

有人可以解释为什么下面的C#行与下面的foeach块的行为不一样吗?

string [] strs = {"asdf", "asd2", "asdf2"};
strs.Select(str => doSomething(str));


foreach(string str in strs){
  doSomething(str);
}
Run Code Online (Sandbox Code Playgroud)

我在doSomething()中放置了一个断点,它不会在Select中触发,但它与foreach一起触发.

TIA

Jak*_*cki 10

这是因为LINQ查询是延迟的.传递给Select方法的lambda 实际上是在访问结果时执行的.

尝试:

string [] strs = {"asdf", "asd2", "asdf2"};
var result = strs.Select(str => doSomething(str));

foreach(var item in result) {
}
Run Code Online (Sandbox Code Playgroud)


far*_*jad 1

在将查询转换为using 、等Linq之前,不会处理该查询。EnumarableToList()ToArray()

顺便说一下,与你的foreach陈述等效的是这样的:

strs.ForEach(doSomething);

strs.ToList().ForEach(doSomething);
Run Code Online (Sandbox Code Playgroud)

或者

Array.ForEach(strs, doSomething);
Run Code Online (Sandbox Code Playgroud)