Reactive Extensions .MaxBy

时间:2017-08-23 12:49:29

标签: c# system.reactive

为什么

toString()
火,但不是

var a = Observable.Interval(TimeSpan.FromSeconds(1))
    .Publish();

a.Subscribe(o =>
{
    Console.WriteLine("Test");
});
a.Connect();

我试图在不同的场景中使用MaxBy但是甚至无法使上述功能发挥作用。

这是我更复杂的例子

var a = Observable.Interval(TimeSpan.FromSeconds(1))
    .MaxBy(o=>o)
    .Publish();

a.Subscribe(o =>
{
    Console.WriteLine("Test");
});
a.Connect();

2 个答案:

答案 0 :(得分:3)

当源observable终止时,

media only screen and (max-width: 767px) { .sbi_container{ max-width:400px; display: block; }} Max仅发出单个值。如果你有一个非终止源,它们将永远不会发射。

尝试使用此代码作为反例:

MaxBy

答案 1 :(得分:2)

Shlomo将其钉住,因为.MaxBy无法在非终止序列上生成值。

如果您愿意,可以使用.Scan创建迄今为止最大值的序列。

你可以这样做:

var a =
    Observable
        .Interval(TimeSpan.FromSeconds(1))
        .Select(x => x % 4L)
        .Scan(long.MinValue, (x, y) => x > y ? x : y)
        .Publish();

a.Subscribe(o =>
{
    Console.WriteLine(o);
});
a.Connect();

我放入.Select(x => x % 4L)以使序列更有趣。

这给出了:

0
1
2
3
3
3
3
3

如果您希望仅在有新的最大值时生成值,请在.DistinctUntilChanged()之后添加.Scan。好又简单。