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不应该用于非终止源的文档。有两个最好的文档站点,它们都准确地描述了这一点:如果您认为缺少文档,请随意填补空白。