2010-03-17 6 views
5

Pourquoi un gestionnaire d'événements n'est jamais appelé s'il est ajouté dans une boucle sur un ienumerable?Pourquoi un gestionnaire d'événements n'est jamais appelé s'il est ajouté dans une boucle sur un ienumerable?

Par exemple:

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

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

Bu si la liste est affectée comme

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

le gestionnaire d'événements ne s'appelle ..

Pourquoi? (Je suppose qu'il a quelque chose à voir avec le fait qu'une requête LINQ est paresseux, mais le fait de boucle à travers le résultat ne suffit pas?)

Répondre

3

Votre appel Select crée de nouvelles instances de MyType, ce qui signifie que. ..

Lorsque list est typée comme IEnumerable<MyType> alors vous avez affaire à une nouvelle séquence de nouveaux chaque fois que vous énumérez list objets. Les objets auxquels vous ajoutez des gestionnaires d'événements ne sont pas les mêmes objets que vous testez par la suite.

Lorsque list est typé comme MyType[] (en utilisant l'appel ToArray), alors vous avez affaire à la même collection d'objets chaque fois que vous énumérez list. Les objets auxquels vous ajoutez des gestionnaires d'événements sont les mêmes objets que vous testez par la suite.