Ранее я выполнял рефакторинг некоторого кода и наткнулся на реализацию блока итератора, в котором я не был слишком уверен.В слое интеграции системы, где клиент вызывает внешний API для некоторых данных, у меня есть набор трансляторов, которые берут данные, возвращенные из API, и переводят их в коллекции бизнес-объектов, используемых на логическом уровне.Обычный класс переводчика будет выглядеть так:
// translate a collection of entities coming back from an extrernal source into business entities
public static IEnumerable<MyBusinessEnt> Translate(IEnumerable<My3rdPartyEnt> ents) {
// for each 3rd party ent, create business ent and return collection
return from ent in ents
select new MyBusinessEnt {
Id = ent.Id,
Code = ent.Code
};
}
Сегодня я наткнулся на следующий код.Опять же, это класс переводчика, его цель - перевести коллекцию в параметре в тип возврата метода.Однако на этот раз это блок итератора:
// same implementation of a translator but as an iterator block
public static IEnumerable<MyBusinessEnt> Translate(IEnumerable<My3rdPartyEnt> ents) {
foreach(var ent in ents)
{
yield return new MyBusinessEnt {
Id = ent.Id,
Code = ent.Code
};
}
}
Мой вопрос: действительно ли это блок итератора?Я не вижу преимущества создания класса переводчика таким образом.Может ли это привести к неожиданному поведению?