我有一个关于 RX 的小问题。我有来自键盘的符号流,我需要将它们分组。 ';' 应该开始一个新组符号来自流。简单来说,我需要一个类似于 Buffer 的操作符,但它会在某个条件为真时触发,而不是在一些时间延迟或事件计数之后触发。有没有办法用 RX 中已经存在的运算符(operator)来构建它,还是我应该自己注册?

最佳答案

这是一个来源。

var source = new[] { 'a', 'b', ';', 'c', 'd', 'e', ';' }.ToObservable();

这就是你要问的:
var groups = source
    // Group the elements by some constant (0)
    // and end the group when we see a semicolon
    .GroupByUntil(x => 0, group => group.Where(x => x == ';'))

这是一种使用方法:
groups
    // Log that we're on the next group now.
    .Do(x => Console.WriteLine("Group: "))
    // Merge / Concat all the groups together
    // {{a..b..;}..{c..d..e..;}} => {a..b..;..c..d..e..;}
    .Merge()
    // Ignore the semicolons? This is optional, I suppose.
    .Where(x => x != ';')
    // Log the characters!
    .Do(x => Console.WriteLine("  {0}", x))
    // Make it so, Number One!
    .Subscribe();

输出:
Group:
  a
  b
Group:
  c
  d
  e

关于c# - 带有反应式扩展的分区序列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22811411/

10-13 08:33