Я реорганизовал некоторый код ранее и натолкнулся на реализацию блока итератора, в котором я не был уверен. На уровне интеграции системы, где клиент вызывает внешний 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
};
}
}
Мой вопрос: допустимо ли это использование блока итератора? Я не вижу преимущества создания класса переводчика таким образом. Может ли это привести к неожиданному поведению?