【问题标题】:Scan operator with a result selector带有结果选择器的扫描运算符
【发布时间】:2021-12-16 01:45:42
【问题描述】:

在 Rx.NET 中,Aggregate 具有接受 resultSelector 的重载,但 Scan 不接受。是否有一个原因?我将如何创建一个接受结果选择器的Scan 运算符,即带有签名:IObservable<TResult> Scan<TSource,TAccumulate,TResult>(this IObservable<TSource> source, TAccumulate seed, Func<TAccumulate,TSource,TAccumulate> accumulator, Func<TAccumulate,TResult> resultSelector)

【问题讨论】:

    标签: c# .net system.reactive reactive-streams rx.net


    【解决方案1】:

    下面的简单实现就足够了吗?

    public static IObservable<TResult> Scan<TSource, TAccumulate, TResult>(
        this IObservable<TSource> source,
        TAccumulate seed,
        Func<TAccumulate, TSource, TAccumulate> accumulator,
        Func<TAccumulate, TResult> resultSelector)
    {
        return source.Scan(seed, accumulator).Select(resultSelector);
    }
    

    【讨论】:

    • 谢谢 - 是的,我认为这没问题。附带说明一下,我的累积类型实际上是一个队列,在结果选择器中我想从队列中取出元素。这被认为是不好的做法吗?
    • @jackdry 恕我直言,编写“副作用”Rx 代码是可以的。显然,这样做代码变得更加脆弱且难以维护,但有时您必须这样做,因为替代方案更糟。我的建议是通过使用专门用于引入副作用的运算符(即 Do 运算符)来明确您的意图,而不是将副作用隐藏在看似无害的 Select 投影中。
    猜你喜欢
    • 2014-03-29
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 2016-08-24
    • 2020-07-01
    • 1970-01-01
    相关资源
    最近更新 更多