【问题标题】:c# reactive extensions from IEnumerable<IObservable<string>> to IObservable<string>c# 从 IEnumerable<IObservable<string>> 到 IObservable<string> 的响应式扩展
【发布时间】:2014-08-07 23:17:00
【问题描述】:

我想使用响应式扩展来编写扩展方法

public static IObservable<string> ToString(
  this IEnumerable<IObservable<string>> collection,
  string start,
  string separator,
  string stop)
  {

  }

它产生一个字符串流,反映作为参数传递的流集合的最新内容。我还提供了一个起始字符串、一个分隔符和一个停止字符串以用于格式化。

当所有 observables 至少触发一次时,我想跟踪字符串表示,因为不同的 observables 触发更新。

例如,假设 start 是 "{",separator 是 ";",stop 是 "}",那么集合中有 3 个 observables 都首先触发了 "0",我想要 "{0; 0;0}" 是结果 observable 生成的初始字符串。

现在假设集合的第一个 observable 推送“1”,我希望生成的下一个字符串是“{1;0;0}”等等。

已经谢谢你的回答了。

【问题讨论】:

    标签: c# .net system.reactive reactive-programming


    【解决方案1】:

    您在此处描述的内容与CombineLatest 非常相似。请尝试以下操作:

    public static IObservable<string> ToString(this IEnumerable<IObservable<string>> observables, string start, string separator, string stop)
    {
        return observables.CombineLatest()
                          .Select(values =>
                          {
                              var sb = new StringBuilder(start);
                              var first = true;
    
                              foreach (var value in values)
                              {
                                  if (first)
                                      first = false;
                                  else
                                      sb.Append(separator);
    
                                  sb.Append(value);
                              }
    
                              sb.Append(stop);
                              return sb.ToString();
                          });
    }
    

    【讨论】:

    • 我认为您可以将选择更改为使用 String.Join 以使其更加简单。 Select(values => start + String.Join(separator, values) + stop)
    • 没错,但我选择限制字符串连接。
    • 谢谢卢卡斯。我曾考虑过 CombineLatest,但似乎没有可枚举的重载。只能合并两个流。
    • @GillesMeyer 我肯定有这样的超载。你确定你的 Rx 库是最新的吗?
    • @LucasTrzesniewski 你是对的!现在我有超载,解决方案工作得很好。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多