Reactive Extension可以捕获/检测连续的病例



使用此选项,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个数字时,我想捕捉/检测。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"));

相关内容

  • 没有找到相关文章

最新更新