下面的代码在编译时会被简化为状态机中的100行代码,只是为了枚举内部IEnumerable,而IEnumerable拥有自己的状态机。
这感觉效率低下。
public abstract class C {
public abstract (IEnumerable<int>,bool) getABatch();
IEnumerable<int> getLots(){
bool hasMore;
do{
(var stuff,hasMore)=getABatch();
foreach(var thing in stuff)
yield return thing;
} while (hasMore)
}
}
我想获取很多批次并将它们全部退回为1个可枚举的长整数。我宁愿不要建立冗长的清单,因为我不知道会通过多少数据(可能是数百万个项目)。
问题: 是否有比手动产生所有内部元素更好的方法来处理此枚举? 鉴于内部可枚举具有所需的全部信息,因此感觉应该有一种更简单的方法。
答案 0 :(得分:4)
您是否有理由专门枚举getABatch集合?如果没有,您可以return getABatch();
。如果是,但是在循环中不需要进行任何其他操作,则还可以使用ToArray()
扩展名,该扩展名将为您迭代集合,然后您可以返回仍为IEnumerable的数组。
编辑:我看到您已编辑问题以在while循环中提取批次。在这种情况下,我会说使用收益率回报实际上没有错。 但是,您可以初始化结果集合,并在完成之前简单地将所有内容添加到其中。
IEnumerable<int> getLots(){
bool hasMore;
var result = new List<int>();
do{
(var stuff,hasMore)=getABatch();
result.AddRange(stuff);
} while (hasMore)
return result;
}