IEnumerable选择

时间:2011-11-02 19:22:39

标签: c# linq

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

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


foreach(string str in strs){
  doSomething(str);
}

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

TIA

4 个答案:

答案 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查询只有在您使用EnumarableToList()等将其转换为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,看看为什么会发生这种情况。