gpt4 book ai didi

c# - 检查 yield return 是否包含项目

转载 作者:行者123 更新时间:2023-11-30 15:27:50 24 4
gpt4 key购买 nike

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

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() 打败了 yield return 的整个想法,如果我检查可枚举中的第一项,它是从枚举中删除。

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

TL;DR:如何在不开始迭代的情况下检查 yield 返回的可枚举对象是否包含任何对象?

最佳答案

对于您的实际问题“如何在不开始迭代的情况下检查 yield 返回的可枚举对象是否包含任何对象?”好吧,你不知道。

就这么简单,您不能使用句号,因为您可以使用 IEnumerable 做的唯一事情就是枚举它。然而,调用 Any() 不是问题,因为它“确实”仅枚举第一个元素(而不是整个列表),但不可能枚举任何内容,因为许多 ienumerables 不以任何形式存在,除了管道(可能没有后备集合,不可能检查不存在的东西是否有任何元素,按照设计这是没有意义的)

编辑:另外,我在您的代码中没有看到任何 yield ,您是否混淆了等待和 yield 概念(完全不相关)?

关于c# - 检查 yield return 是否包含项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26843222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com