其他分享
首页 > 其他分享> > CodeGo.net>检查收益率回报是否包含项目

CodeGo.net>检查收益率回报是否包含项目

作者:互联网

我正在尝试优化看起来像这样的例程(简化):

public async Task<IEnumerable<Bar>> GetBars(ObjectId id){
    var output = new Collection<Bar>();

    var page = 1;
    var hasMore = true;

    while(hasMore) {
        var foos = await client.GetFoos(id, page);

        foreach(var foo : foos) {

            if(!Proceed(foo)) {
                hasMore = false;
                break;
            }

            output.Add(new Bar().Map(foo)
        }

        page++;

    return output;
}

调用GetBars()的方法看起来像这样

public async Task<Baz> GetBaz(ObjectId id){
    var bars = await qux.GetBars();

    if(bars.Any() {
        var bazBaseData = qux.GetBazBaseData(id);
        var bazAdditionalData = qux.GetBazAdditionalData(id);

        return new Baz().Map(await bazBaseData, await bazAdditionalData, bars);
    }
}

GetBaz()返回0到很多项目之间.由于我们要遍历数百万个id,因此最初添加了if(bars.Any())语句作为加速应用程序的最初尝试.

由于正在等待GetBars(),因此它将阻塞线程,直到它收集了所有数据(这可能需要一些时间).我的想法是使用yield return,然后将if(bars.Any())替换为检查是否至少有一个元素的检查,因此我们可以同时触发另外两个异步方法(这也需要花费一些时间)时间执行).

我的问题是如何做到这一点.我知道System.Linq.Count()和System.Linq.Any()挫败了收益回报的整个想法,如果我检查可枚举中的第一个项目,它将被从可枚举中删除.

除了向GetBars()添加out参数外,还有其他/更好的选择吗?

TL; DR:如何检查收益回报中的可枚举是否包含任何对象而没有开始对其进行迭代?

解决方法:

对于您的实际问题“我如何检查收益回报中的可枚举是否包含任何对象而没有开始对其进行迭代?”好吧,你没有.

就是这么简单,您无法周期,因为枚举IEnumerable唯一可以做的就是很好.但是,调用Any()并不成问题,因为“仅”枚举第一个元素(而不是整个列表),但由于任何可枚举的形式都不存在,因此无法枚举任何东西.管道(可能没有后备集合,无法通过设计检查是否不存在的东西是否具有任何元素)

编辑:另外,我在您的代码中看不到任何收益,您是否将等待的收益概念混合在一起(完全无关)?

标签:yield-return,null-check,c
来源: https://codeday.me/bug/20191029/1956466.html