发布
社区首页 >问答首页 >迭代器块的正确使用

迭代器块的正确使用
EN

Stack Overflow用户
提问于 2012-02-10 17:05:33
回答 5查看 1.5K关注 0票数 8

我之前正在重构一些代码,我偶然发现了一个迭代器块的实现,我不太确定。在系统的集成层中,客户端为某些数据调用了一个抽象API,我有一组翻译器,它们将API返回的数据转换为逻辑层中使用的业务实体集合。常见的翻译类如下所示:

代码语言:javascript
代码运行次数:0
复制
// 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
           };
}

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

代码语言:javascript
代码运行次数:0
复制
// 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
        };
    }
}

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-10 17:20:16

你的两个样本做的差不多是一样的。查询版本将被重写为对Select的调用,而Select编写得与您的第二个示例完全一样;它迭代源集合中的每个元素,并返回一个转换后的元素。

这是迭代器块的一种完全有效的使用,当然,这样编写您自己的迭代器块已经没有必要了,因为您可以只使用Select

票数 16
EN

Stack Overflow用户

发布于 2012-02-10 17:07:22

是的,这是有效的。foreach具有可调试的优点,所以我倾向于采用这种设计。

票数 3
EN

Stack Overflow用户

发布于 2012-02-10 17:08:19

第一个例子不是迭代器。它只创建并返回一个IEnumerable<MyBusinessEnt>

第二个是迭代器,我看不出它有什么问题。每次调用者遍历该方法的返回值时,yield将返回一个新元素。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9231736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档