2010-03-17 21 views
5

¿Por qué un controlador de eventos nunca se llama si se agrega dentro de un bucle en un ienumerable?¿Por qué un controlador de eventos nunca se llama si se agrega dentro de un bucle en un ienumerable?

Por ejemplo:

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

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

Bu si se asigna lista como

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

el controlador de eventos se consiga llamar ..

¿Por qué? (Me imagino que tiene algo que ver con el hecho de que una consulta LINQ es perezoso, pero el hecho de bucle a través de que el resultado no es suficiente?)

Respuesta

3

Su llamada Select es la creación de nuevas instancias de MyType, lo que significa eso. ..

Cuando list se escribe como IEnumerable<MyType> entonces usted está tratando con una nueva secuencia de nuevos objetos cada vez que enumerar list. Los objetos a los que está agregando controladores de eventos no son los mismos objetos que está probando posteriormente.

Cuando se escribe como listMyType[] (mediante el uso de la llamada ToArray), entonces usted está tratando con la misma colección de objetos cada vez que enumerar list. Los objetos a los que está agregando controladores de eventos son los mismos objetos que está probando posteriormente.

Cuestiones relacionadas