带有结果选择器的扫描运算符

Posted

技术标签:

【中文标题】带有结果选择器的扫描运算符【英文标题】: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)

【问题讨论】:

【参考方案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 投影中。

以上是关于带有结果选择器的扫描运算符的主要内容,如果未能解决你的问题,请参考以下文章

带有向量迭代器的程序中的分段错误

XPath 中 CSS 多重选择器的等价物

选择带有可变布尔运算符的案例

带有数字选择器的 Android PreferenceActivity 对话框

7-21 求前缀表达式的值(25 分)

使用 Scala 解析器的运算符关联性