Почему обработчик событий никогда не вызывается, если он добавлен в цикл в ienumerable? - PullRequest
5 голосов
/ 17 марта 2010

Почему обработчик событий никогда не вызывается, если он добавляется в цикле к ienumerable?

Например:

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

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

Bu, если список назначен как

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

обработчик события вызывается ..

Почему?(Я полагаю, что это как-то связано с тем, что запрос LINQ является ленивым, но сам цикл с результатами не достаточен?)

1 Ответ

3 голосов
/ 17 марта 2010

Ваш Select вызов создает новые экземпляры MyType, что означает, что ...

Когда list набирается как IEnumerable<MyType>, то вы имеете дело с новой последовательностью из новыми объектами каждый раз, когда вы перечисляете list. Объекты, к которым вы добавляете обработчики событий , не являются теми же объектами, которые вы впоследствии тестируете.

Когда list набирается как MyType[] (с помощью вызова ToArray), то вы имеете дело с одной и той же коллекцией объектов при каждом перечислении list. Объекты, к которым вы добавляете обработчики событий , - это те же объекты, которые вы впоследствии тестируете.

...