Что ж, если у вас есть класс коллекции, вы не можете просто обернуть какую-то другую коллекцию, которая является Enumerable и будет возвращать именно то, что вы должны.
Тем не менее, я всегда предпочитаю использовать ключевое слово yield даже для определения перечислимого вручную. Большинство примеров людей, определяющих текущее / следующее движение, просто не знают о доходности или как ее использовать. (Однажды я реализовал перечислимый класс, определяющий Current / Move next по той же причине.)
Другим случаем может быть то, что базовая коллекция старая и не реализует IEnumerable<T>
, а просто IEnumerable
. Если ваша коллекция строго напечатана, вы захотите сделать больше, чем просто вернуть их перечислитель (по крайней мере, это будет вызов .Cast<T>()
).
Если у вас есть базовая коллекция, она также может быть коллекцией какого-то частного вложенного класса (возможно, какой-то пользовательской пары ключ-значение), которую вы не хотите публично раскрывать. Это тот случай, когда вам, возможно, придется возвращать вызов .Select, а не просто передавать существующий перечислитель (но, скорее всего, вам не нужно будет реализовывать собственный итератор).