2010-03-17 2 views
5

Warum wird ein Event-Handler nie aufgerufen, wenn er innerhalb einer Schleife auf einem Imenumerable hinzugefügt wird?Warum wird ein Event-Handler nie aufgerufen, wenn er innerhalb einer Schleife auf einem Imenumerable hinzugefügt wird?

Zum Beispiel:

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

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

Bu wenn Liste wie

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

der Event-Handler genannt bekommt ..

Warum? (Ich stelle mir es etwas mit der Tatsache zu tun hat, dass eine LINQ Abfrage faul ist, aber die Tatsache, dass durch das Ergebnis Looping ist nicht genug?)

Antwort

3

Ihr Select Anruf schafft neue Instanzen von MyType, was das bedeutet. ..

Wenn list eingegeben wird als IEnumerable<MyType> dann bist du mit eine neue Sequenz von neuen Objekte jedes Mal, wenn Sie list aufzählen zu tun. Die Objekte, denen Sie Ereignishandler hinzufügen, sind nicht dieselben Objekte, die Sie anschließend testen.

Wenn list als MyType[] eingegeben wird (durch den ToArray Anruf mit), dann sind Sie mit die gleiche Sammlung von Objekten jedes Mal, wenn list aufzählen zu tun. Die Objekte, denen Sie Ereignisbehandlungsroutinen hinzufügen, sind dieselben Objekte, die Sie anschließend testen.

Verwandte Themen