我觉得很奇怪(我想!)。如果我尝试在yes()方法中放置一个断点,它将永远不会在执行该函数时暂停程序。如果我尝试对任何其他代码行执行相同操作,它将按预期工作。这是一个错误,还是有什么东西逃脱了我?
过滤器将返回2个对象,除调试器外,一切似乎都按预期工作。
private void Form1_Load(object sender, EventArgs e) {
List<LOL> list = new List<LOL>();
list.Add(new LOL());
list.Add(new LOL());
IEnumerable<LOL> filter = list.Where(
delegate(LOL lol) {
return lol.yes();
}
);
string l = ""; <------this is hit by the debugger
}
class LOL {
public bool yes() {
bool ret = true; <---------this is NOT hit by the debugger
return ret;
}
}
答案 0 :(得分:17)
Enumerable.Lhere是一个惰性运算符 - 直到你调用通过where返回的IEnumerable(即调用它上面的.ToList()),你的函数才会被调用。
尝试将代码更改为此代码并查看是否会调用它:
....
IEnumerable<LOL> filter = list.Where(
delegate(LOL lol) {
return lol.yes();
}
).ToList();
string l = "";
答案 1 :(得分:2)
答案 2 :(得分:2)
正如其他人所说,你刚刚定义了你的标准,但没有要求它执行。这叫做延迟加载(伙计们,如果我错了,请纠正我)。
在过滤器上运行foreach循环,看看会发生什么。
答案 3 :(得分:2)
乔纳森是对的。
尝试运行此控制台应用程序并在指示的地方设置断点以便清楚地看到它。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
List<LOL> list = new List<LOL>();
list.Add(new LOL());
list.Add(new LOL());
IEnumerable<LOL> filter = list.Where(
delegate(LOL lol)
{
return lol.yes();
}
);
// Breakpoint #2 will not have been yet.
Console.Write("No Breakpoint"); // Breakpoint #1
// (Breakpoint #2 will now be hit.)
Console.Write("Breakpoint! " + filter.Count());
}
class LOL
{
public bool yes()
{
bool ret = true; // Breakpoint #2
return ret;
}
}
}
}