Правильное использование блоков итератора

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

Мой вопрос: допустимо ли это использование блока итератора? Я не вижу преимущества создания класса переводчика таким образом. Может ли это привести к неожиданному поведению?

8
задан Cody Gray 10 February 2012 в 17:10
поделиться