Reactive Extension 能否 capture/detect 连续案例?
Could Reactive Extension capture/detect consecutive cases?
使用这个,Rx生成一系列0到99之间的随机数。
var R = new Random();
var ints = Observable.Interval(TimeSpan.FromSeconds(1));
var RandomNos = ints.Select(i=> R.Next(100)); // was new Random().Next(100)
RandomNos.Subscribe(r=> Console.Write(r+ ","));
1,75,49,23,97,71,45,19,93,66,40,14,88,62,36,10,84
当我连续获得 6 个超过 50 的数字时,我想 capture/detect。 Rx 可以吗?
RandomNos.?????()
.Subscribe(l=> Console.WriteLine ("You got 6 more-than-50 numbers in a row"));
一种方法是使用 Buffer
方法。
var random = new Random();
var result = Observable.Interval(TimeSpan.FromSeconds(1))
.Select(i => random.Next(100))
.Buffer(6, 1)
.Where(buffer => buffer.All(n => n > 50))
如果您尝试检测的不是连续 6 行,而是连续 K
,其中 K 真的非常大,那么您可能想要使用 Window
相反,但是由于这里的 K = 6,所以最简单的方法就是按照我的建议去做。
另外请注意,从 {0, 1, ..., 99} 中均匀抽取的数字大于 50 的概率是 49/100,而不是 1/2。
只是为了好玩,这里有一个只对连续的任何 "n" 使用一个计数器 - 它保持 运行 计数超过 50 的数字 - Take(1)
完成第一次出现时流。
RandomNos.Scan(0, (a,x) => x > 50 ? ++a : 0)
.Where(x => x == 6)
.Take(1)
.Subscribe(_ => Console.WriteLine("You got 6 more-than-50 numbers in a row"));
使用这个,Rx生成一系列0到99之间的随机数。
var R = new Random();
var ints = Observable.Interval(TimeSpan.FromSeconds(1));
var RandomNos = ints.Select(i=> R.Next(100)); // was new Random().Next(100)
RandomNos.Subscribe(r=> Console.Write(r+ ","));
1,75,49,23,97,71,45,19,93,66,40,14,88,62,36,10,84
当我连续获得 6 个超过 50 的数字时,我想 capture/detect。 Rx 可以吗?
RandomNos.?????()
.Subscribe(l=> Console.WriteLine ("You got 6 more-than-50 numbers in a row"));
一种方法是使用 Buffer
方法。
var random = new Random();
var result = Observable.Interval(TimeSpan.FromSeconds(1))
.Select(i => random.Next(100))
.Buffer(6, 1)
.Where(buffer => buffer.All(n => n > 50))
如果您尝试检测的不是连续 6 行,而是连续 K
,其中 K 真的非常大,那么您可能想要使用 Window
相反,但是由于这里的 K = 6,所以最简单的方法就是按照我的建议去做。
另外请注意,从 {0, 1, ..., 99} 中均匀抽取的数字大于 50 的概率是 49/100,而不是 1/2。
只是为了好玩,这里有一个只对连续的任何 "n" 使用一个计数器 - 它保持 运行 计数超过 50 的数字 - Take(1)
完成第一次出现时流。
RandomNos.Scan(0, (a,x) => x > 50 ? ++a : 0)
.Where(x => x == 6)
.Take(1)
.Subscribe(_ => Console.WriteLine("You got 6 more-than-50 numbers in a row"));