【发布时间】:2018-08-21 08:44:10
【问题描述】:
我是响应式扩展 (rx) 的新手,并尝试在 .NET 中执行以下操作(但在 JS 和其他语言中应该相同。):
我有一个带有包含字符串和布尔属性的对象的流传入。流将是无限的。我有以下条件:
- 应始终打印第一个对象。
- 现在应该跳过所有传入的对象,直到有布尔属性设置为“true”的对象到达。
- 当一个对象到达时 bool 属性设置为“true”,应该跳过这个对象,但应该打印下一个对象(不管属性是什么)。
- 现在这样下去,应该打印属性设置为 true 的对象之后的每个对象。
例子:
("one", false)--("two", true)--("three", false)--("four", false)--("five", true)--("six", true)--("seven", true)--("eight", false)--("nine", true)--("ten", false)
预期结果:
"one"--"three"--"six"--"seven"--"eight"--"ten"
注意“六”和“七”已被打印,因为它们跟随一个属性设置为 true 的对象,即使它们自己的属性也设置为“true”。
简单的 .NET 程序来测试它:
using System;
using System.Reactive.Linq;
using System.Threading;
namespace ConsoleApp1
{
class Program
{
class Result
{
public bool Flag { get; set; }
public string Text { get; set; }
}
static void Main(string[] args)
{
var source =
Observable.Create<Result>(f =>
{
f.OnNext(new Result() { Text = "one", Flag = false });
Thread.Sleep(1000);
f.OnNext(new Result() { Text = "two", Flag = true });
Thread.Sleep(1000);
f.OnNext(new Result() { Text = "three", Flag = false });
Thread.Sleep(1000);
f.OnNext(new Result() { Text = "four", Flag = false });
Thread.Sleep(1000);
f.OnNext(new Result() { Text = "five", Flag = true });
Thread.Sleep(1000);
f.OnNext(new Result() { Text = "six", Flag = true });
Thread.Sleep(1000);
f.OnNext(new Result() { Text = "seven", Flag = true });
Thread.Sleep(1000);
f.OnNext(new Result() { Text = "eight", Flag = false });
Thread.Sleep(1000);
f.OnNext(new Result() { Text = "nine", Flag = true });
Thread.Sleep(1000);
f.OnNext(new Result() { Text = "ten", Flag = false });
return () => Console.WriteLine("Observer has unsubscribed");
});
}
}
}
我尝试使用 .Scan 和 .Buffer 扩展,但我不知道如何在我的场景中使用它们。
性能当然要尽可能好,因为最终流是无限的。
【问题讨论】:
标签: c# .net rxjs reactive-programming system.reactive