正确使用迭代器块

jam*_*wis 8 .net c# iterator

我之前正在重构一些代码,我遇到了一个迭代器块的实现,我不太确定.在客户端为某些数据调用extrernal 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
           };
}
Run Code Online (Sandbox Code Playgroud)

今天我遇到了以下代码.同样,它是一个翻译类,它的目的是将参数中的集合转换为方法返回类型.但是,这次它是一个迭代器块:

// 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
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:这是迭代器块的有效使用吗?我看不出以这种方式创建翻译类的好处.这会导致一些意想不到的行为吗?

Eri*_*ert 15

你的两个样本几乎完全相同.查询版本将被重写为对Select的调用,而Select的编写方式与第二个示例完全相同; 它遍历源集合中的每个元素,并返回一个转换后的元素.

这是迭代器块的完全有效使用,但是当然不再需要像这样编写自己的迭代器块,因为你可以使用它Select.