是否有一种简单的方法来产生IEnumerable中的所有元素

时间:2020-05-14 08:08:09

标签: c#

下面的代码在编译时会被简化为状态机中的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)
    }
}

Sharplab version

我想获取很多批次并将它们全部退回为1个可枚举的长整数。我宁愿不要建立冗长的清单,因为我不知道会通过多少数据(可能是数百万个项目)。

问题: 是否有比手动产生所有内部元素更好的方法来处理此枚举? 鉴于内部可枚举具有所需的全部信息,因此感觉应该有一种更简单的方法。

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;
}