我早些时候重构了一些代码,遇到了一个不太确定的迭代器块的实现。在客户端正在为某些数据调用外部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
};
}
}
我的问题是:这是对迭代器块的有效使用吗?我看不到以这种方式创建翻译器类的好处。这会导致某些意外行为吗?
最佳答案
您的两个样本几乎完全相同。查询版本将被重写为对Select的调用,并且Select的编写方式与您的第二个示例完全相同;它遍历源集合中的每个元素,并yield-返回一个转换后的元素。
这是对迭代器块的完全有效使用,尽管当然不再需要像这样编写自己的迭代器块,因为您可以只使用Select
。