IE枚举选择

发布于 2024-12-13 20:56:24 字数 290 浏览 0 评论 0原文

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

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


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

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

TIA

Can someone explain why the following line of C# doesn't behave the same as the following foeach block?

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


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

I put a breakpoint inside of doSomething() and it doesn't fire in the Select but it does with the foreach.

TIA

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

难得心□动 2024-12-20 20:56:24

这是因为 LINQ 查询被延迟。当您访问结果时,实际上会执行传递给 Select 方法的 lambda。

尝试:

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

foreach(var item in result) {
}

This is because LINQ queries are deferred. The lambda passed to the Select method is actually executed when you access the result.

Try:

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

foreach(var item in result) {
}
请恋爱 2024-12-20 20:56:24

在使用 ToList()ToArray()Linq 查询转换为 Enumarable 之前,不会处理 Linq 查询> 等。

顺便说一句,相当于您的 foreach 语句是这样的:

strs.ForEach(doSomething);

strs.ToList().ForEach(doSomething);

Array.ForEach(strs, doSomething);

The Linq query won't be processed until you convert it to an Enumarable using ToList(), ToArray(), etc.

And by the way the equivalent to your foreach statement is something like this:

strs.ForEach(doSomething);

strs.ToList().ForEach(doSomething);

or

Array.ForEach(strs, doSomething);
诗笺 2024-12-20 20:56:24

你需要做类似的事情

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


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

you would need to do something like

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


foreach(string str in strs){
  doSomething(str);
}
流心雨 2024-12-20 20:56:24

我认为一旦您使用从 select 返回的值,您就会看到 doSomething() 被调用。查看 yield 了解发生这种情况的原因。

I think once you use the values returned from the select you'll see doSomething() called. Check out yield to see why this is happening.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文