gpt4 book ai didi

c# - 用 Rx 尝试 5 次

转载 作者:行者123 更新时间:2023-12-02 05:18:18 24 4
gpt4 key购买 nike

我想每秒尝试一些东西,持续五秒钟,如果它们都是假的,则返回 false,并在第一次为真时返回 true。势在必行,它看起来像这样:

bool TryFiveTimes()
{
for (int i = 0; i < 5; i++)
{
if (Fn())
return true;
System.Threading.Thread.Sleep(1000);
}
return false;
}

我想用 Rx 来做这件事,但想不出一个巧妙的方法。我目前的尝试是:

bool TryFiveTimes()
{
return Observable.Interval(TimeSpan.FromSeconds(1))
.Take(5)
.Select(_ => Fn())
.Scan(false, (curr, prev) => curr || prev)
.Last();
}

这将给出正确的结果,但如果 Fn() 在结束前返回 true,则不会提前返回。

最佳答案

对于您的实现,只需使用 .First() 方法而不是 .Last()

    static bool TryFiveTimes()
{
return Observable.Interval(TimeSpan.FromSeconds(1))
.Take(5)
.Select(_ => Fn())
.Scan(false, (curr, prev) => curr || prev)
.FirstOrDefault(v => v);
}

static int counters = 0;
static bool Fn()
{
counters++;
Console.WriteLine(counters);
return counters > 2;
}

[编辑]:添加的代码将证明 Fn 方法只会在它第一次返回 True 之前执行

此外,您实际上并不需要 Scan() ,较短的版本是:

    return Observable
.Interval(TimeSpan.FromSeconds(1))
.Take(5)
.Select(_ => Fn())
.FirstOrDefault(v => v);

关于c# - 用 Rx 尝试 5 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14273318/

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