c# - 将最后一项推送到 Observable(序列)

标签 c# .net system.reactive rx.net

我有一个 IObservable<Item>在一个类中,我想公开一个只读属性,该属性提供在给定时间推送到可观察对象的最后一项。所以它将提供一个单一的值 Item .

如果没有值被推送,那么它必须返回一个默认值。

我怎样才能做到这一点而不必订阅 observable 并且没有“支持字段”?

最佳答案

只是在这里补充一下@Asti 的回答,也许可以帮助您解决挫败感:

Observable 不是物理“事物”,它更像是一个逻辑概念。经常将 Rx 与 LINQ 进行比较,并且在很多时候这是一个公平的比较。但当您开始谈论数据结构时,它会崩溃:LINQ 的枚举与用于学习目的的列表非常相似。

但是,在 Rx 方面,根本没有与 List 等效的东西。可观察对象是一种 transient 数据结构,所有运算符都处理这种 transient 。如果您正在寻找永久状态,那么您将离开 Rx。

话虽如此,将可观察对象转换为某种状态是一个常见问题,并且有一些包可以帮助您:ReactiveUI 可能是最著名的。 ReactiveProperty 是另一个。这两个软件包都有缺陷,但可能对您有所帮助。

如果您只是想寻找一种更简单的方法来获得支持字段,而无需对支持字段进行锅炉镀,这将起作用:

public static class ReactivePropertyExtensions
{
    public static ReactiveProperty<T> ToReactiveProperty<T>(this IObservable<T> source)
    {
        return new ReactiveProperty<T>(source);
    }

    public static ReactiveProperty<T> ToReactiveProperty<T>(this IObservable<T> source, T defaultValue)
    {
        return new ReactiveProperty<T>(source, defaultValue);
    }
}

public class ReactiveProperty<T> : IDisposable
{
    private IObservable<T> Source { get; }
    private IDisposable Subscription { get; }
    public T Value { get; private set; }

    public ReactiveProperty(IObservable<T> source)
        : this(source, default(T)) { }

    public ReactiveProperty(IObservable<T> source, T defaultValue)
    {
        Value = defaultValue;
        Source = source;
        Subscription = source.Subscribe(t => Value = t);
    }

    public void Dispose()
    {
        Subscription.Dispose();
    }
}

使用示例:

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

var latestTickerValue = ticker.ToReactiveProperty();
Console.WriteLine(latestTickerValue.Value);
await Task.Delay(TimeSpan.FromSeconds(1));
Console.WriteLine(latestTickerValue.Value);
await Task.Delay(TimeSpan.FromSeconds(3));
Console.WriteLine(latestTickerValue.Value);

关于c# - 将最后一项推送到 Observable(序列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42042478/

相关文章:

c# - 恢复Nuget包...他从哪里得到用户名?

c# - 从 C# 调用 Delphi 6 DLL 会导致不同的舍入?

c# - 为什么我不应该实现 IObservable<T>?

c# - System.Reactive 3.0 中缺少 Observable 类和 ToObservable

c# - 在产品属性选择更改时更改产品规范价格

c# - 即使在启用 CORS 后,我也无法访问客户端上的 Response.Headers ("Content-Disposition")

c# - 程序关闭时 "First-chance exceptions"

.net - 对 .NET Framework 的不需要的依赖

.net - 如何在csproj文件中获取环境变量?

c# - 最新的 Reactive Extension (Rx) 教程