C# 反应式扩展

C# 反应式扩展,c#,system.reactive,C#,System.reactive,为什么 var a = Observable.Interval(TimeSpan.FromSeconds(1)) .Publish(); a.Subscribe(o => { Console.WriteLine("Test"); }); a.Connect(); 开火,但不要开枪 var a = Observable.Interval(TimeSpan.FromSeconds(1)) .MaxBy(o=>o) .Publish(); a.Subs

为什么

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

a.Subscribe(o =>
{
    Console.WriteLine("Test");
});
a.Connect();
开火,但不要开枪

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

a.Subscribe(o =>
{
    Console.WriteLine("Test");
});
a.Connect();
我正在尝试在不同的场景中使用MaxBy,但甚至无法实现上述功能

这是我更复杂的例子

var _telemetryBatchObservable = Observable.FromEventPattern<DeviceStateStreamEventArg>(
        ev => DeviceStateStreamEvent += ev,
        ev => DeviceStateStreamEvent -= ev)
    .Synchronize()
    .GroupBy(o => o.EventArgs.DeviceId)
    .Select(o => o.MaxBy(i => i.EventArgs.DateTimeOffset))
    .SelectMany(o => o.Select(i => i))
    .SelectMany(o => o.Select(i => i))
    .Buffer(TimeSpan.FromMilliseconds(5000), 100)
    .Publish();
var\u telemetryBatchObservable=Observable.FromEventPattern(
ev=>DeviceStateStreamEvent+=ev,
ev=>DeviceStateStreamEvent-=ev)
.Synchronize()
.GroupBy(o=>o.EventArgs.DeviceId)
.Select(o=>o.MaxBy(i=>i.EventArgs.DateTimeOffset))
.SelectMany(o=>o.Select(i=>i))
.SelectMany(o=>o.Select(i=>i))
.Buffer(时间跨度从毫秒(5000),100)
.Publish();

Max
MaxBy
仅在源可观测终止时发出一个值。如果您有一个非终止源,它们将永远不会发射

请尝试以下代码作为反例:

var a = Observable.Interval(TimeSpan.FromSeconds(1))
    .Take(3) //causes termination after 3 values
    .MaxBy(o => o)
    .Publish();

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();
我输入了
。选择(x=>x%4L)
使序列更有趣

这就产生了:

0 1 2 3 3 3 3 3 0 1. 2. 3. 3. 3. 3. 3.
如果只想在存在新的最大值时生成值,请在
.Scan
之后添加一个
.DistinctUntilChanged()
。很好,很简单。

人们如何知道哪些对非终止源有效,哪些对非终止源无效?文档、实验。几乎所有聚合运算符都只在终止时发出:唯一的例外是扫描。Rx是在Linq之后形成的,Linq也只在可枚举完成时发出一个值。缓冲区和样本可以很好地处理实时流。。。我找不到任何说明MaxBy不应该用于非终止源的文档。有两个最好的文档站点,它们都准确地描述了这一点:如果您认为缺少文档,请随意填补空白。