【问题标题】:Special handling for first element in observable对 observable 中第一个元素的特殊处理
【发布时间】:2019-08-08 09:05:00
【问题描述】:

这似乎应该是微不足道的,但我已经浪费了几个小时。我有一个 Observable 字符串:

S:  ---a------b----------c------->

我想以某种方式将其转换为逗号分隔的字符串:

L:  ---a------,b---------,c------>

注意第一项前没有逗号;这很关键。然后我可以订阅这个序列来输出一个逗号分隔的列表:

L.Subscribe(Console.Write); // "a,b,c,..."

(顺便说一句:S 很慢)。

一个明显的解决方案是创建一系列分隔符:

C:  -- --,--,--,--,--,--,--,--,-->

然后我们只是压缩它们:

L = S.Zip(C, (s,c)=>c+s)

创建 C 语言很容易,对吧? C = Observable.Return("").Concat(Observable.Repeat(",")).

但我发现无限序列解决方案存在两个问题,例如重复:

  1. 对 L.Subscribe() 的调用阻塞。我真的不希望它阻塞。
  2. 感觉确实效率低下。当我们在等待 S 时,C 正在疯狂地输出值——我们扔掉了 99% 的值。我尝试用 Interval(TimeSpan.Zero) 替换重复并获得 100% 的 CPU!

解决这些无限序列问题会很棒,但我想找到一种通用方法对第一个元素进行特殊处理也是可以的。无论采用何种解决方案,都不能触及 S 的当前实现。

【问题讨论】:

    标签: c# observable reactive


    【解决方案1】:

    您可以通过使用.Select() 重载来跳过将, 应用于第一个元素,这会暴露当前元素的索引。

    类似:

    using System;
    using System.Reactive.Linq;
    
    namespace RxTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                var observable = "abcd".ToObservable()
                    .Select((c, i) => i == 0 ? c.ToString() : $",{c}");
    
                observable.Subscribe(Console.Write); 
            }
        }
    }
    

    打印:

    a,b,c,d
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2020-08-30
      • 2018-11-26
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      相关资源
      最近更新 更多