Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Debugger does not hit breakpoint

I found something quite odd(I think!). If I try to put a breakpoint in the yes() method, it will never pause the program when it executes the function. If I try to do the same to any other line of code, it will work just as expected. Is it a bug, or is there something that's escaping me?

The filter will return the 2 objects, everything seems to be working as expected except the debugger.

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;
    }
}
like image 489
Jorge Branco Avatar asked Jun 23 '09 03:06

Jorge Branco


2 Answers

Enumerable.Where is a lazy operator -- until you call something that goes through the IEnumerable returned by where (ie. calling .ToList() on it), your function won't get called.

Try changing your code to this and see if it gets called:

....
IEnumerable<LOL> filter = list.Where(
    delegate(LOL lol) {
        return lol.yes();
    }
).ToList();

string l = "";
like image 81
Jonathan Rupp Avatar answered Sep 20 '22 08:09

Jonathan Rupp


You have to materialize the list. Add a ...

filter.ToList();

... after the declaration and you will hit your breakpoint. About the best discussion I've seen on that is here. It does lazy evaluation much better justice than I could do.

like image 34
JP Alioto Avatar answered Sep 21 '22 08:09

JP Alioto