views:

38

answers:

1

Why does an event handler never get called if it's added within a loop on an ienumerable?

For instance:

IEnumerable<MyType> list = someCollection.Select(i => new MyType(i));

foreach (var item in list)
item.PropertyChanged += item_PropertyChanged; <-- this never gets called

Bu if list is assigned like

list = someCollection.Select(i => new MyType(i)).ToArray();

the event handler does get called..

Why? (I imagine it has something to do with the fact that a LINQ query is lazy, but the fact of looping through the result isn't enough?)

+3  A: 

Your Select call is creating new instances of MyType, which means that...

When list is typed as IEnumerable<MyType> then you're dealing with a new sequence of new objects each time you enumerate list. The objects to which you're adding event handlers are not the same objects that you're subsequently testing.

When list is typed as MyType[] (by using the ToArray call) then you're dealing with the same collection of objects each time you enumerate list. The objects to which you're adding event handlers are the same objects that you're subsequently testing.

LukeH