假设你有一个IObservable<uint>类型的可观测震源.我在找一个变换函数

IObservable<uint> Countdown(IObservable<uint> source)
{
  // how? Something like ...
  return source.Select(value => ProduceInnerObservable(value)).Switch()
}

它将source转换为以下形式:

  • source产生一个值时,产生的可观测对象应该立即发布相同的值
  • 假设最后发布的元素是N.如果source中没有任何新元素,则Result Observable应该在N个刻度之后发布值N-1;然后在N-1个刻度之后发布值N-2;依此类推,直到发布0
  • source发布新值时,这种类似计时器的行为将根据新值进行重置

示例输入/输出:

Tick time Source observable Result observable
0 10 10
10 9
19 8
21 2 2
23 1
24 0
100 1 1
101 0
... ... ...

实现这一点最优雅的方式是什么?

推荐答案

假设你的"滴答"是以十分之一秒为单位--这可能会满足你的需要:

static void Main()
{
    var subject = new Subject<int>();

    Countdown(subject).TimeInterval().Subscribe(x => Console.WriteLine(x));

    subject.OnNext(10);

    Thread.Sleep(4000);

    subject.OnNext(2);

    Thread.Sleep(4000);

    subject.OnNext(1);

    Console.ReadLine();

}

static IObservable<int> Countdown(IObservable<int> source)
{
    return source.Select(value => Observable.Generate(
        initialState: value-1,
        condition: i => i >= 0,
        iterate: i => i-1,
        resultSelector: i => i,
        timeSelector: _ => TimeSpan.FromMilliseconds(value*100)
        ).StartWith(value)).Switch();
}

Csharp相关问答推荐

Dapper是否可以自动扩展类成员

Monty Hall游戏节目模拟给我50/50的结果

如何在NServicebus中配置学习传输的文件夹(NService bus 8)

无法解析数据库上下文的服务

. net依赖注入如何避免服务类中的新

MAUI查询参数单一字符串项将不起作用

MongoDB.NET-将数据绑定到模型类,但无法读取整数值

JsonSerializer.Deserialize<;TValue>;(String,JsonSerializerOptions)何时返回空?

如何将不同类型的扩展参数的javascript函数转换成C#风格?

我想在文本框悬停时在其底部显示一条线

在具有不同属性名称的两个类之间创建关系

该函数不能检测两条曲线的交点

.NET 8 DI GetServices<;对象&>不工作

C#按名称从类获取属性值类型<;t>;,我需要反射吗?

如何在onNext之前等待订阅者完成?

.NET Google Workspace API获取错误CS0266

如何正确处置所有动态控件?

Azure函数正在返回值列表,但该列表在Chrome中显示为空

在.NET Maui中,Flyoutindow/Hamburger菜单可以在shell 之外实现吗?

具有嵌套属性的IGGroup