【问题标题】:Reactive Extensions Confusion反应式扩展混乱
【发布时间】:2017-03-14 17:13:31
【问题描述】:

我怀疑我对什么是响应式扩展的理解不正确,但我认为它们可以用于订阅对集合的方法调用。我正在考虑 dotnet 中的典型事件处理程序。我的最终目标是在修改集合时触发方法调用。

我有以下小型控制台应用程序示例,正如您在 cmets 中看到的那样,我期待它重新打印结果,或者至少在添加到集合时重新打印最后一个结果。我也尝试过 query.ToList() 来查看重新运行查询是否会再次打印出结果。

   static void Main(string[] args)
    {
        // we have some data that is an IEnumerable It's lazy so we can query it.
        IEnumerable<int> data = new List<int>();

        for (int i = 0; i < 10; i++)
        {
            (data as List<int>).Add(i);
        }

        // create a linq query
        var query = from number in data select number;

        // create observable 
        IObservable<int> observableQuery = query.ToObservable<int>(Scheduler.Default);
        observableQuery.Subscribe(Console.WriteLine);



        /// the numbers get printed here 1.. 9
        Console.ReadKey();
        (data as List<int>).Add(1000);
        var l = query.ToList();
        var j = observableQuery.ToList();

        // the numbers don't get reprinted here... ? Shouldn't they reprint when the collection is modified?

        Console.ReadKey();
    }

【问题讨论】:

  • msdn.microsoft.com/en-us/library/hh212140(v=vs.103).aspx 这样你就没有错误了。但是你有一个参考问题。查询和数据有不同的参考价值。更新数据时,查询不受影响。因此,该集合没有被修改
  • @misha130 我知道这不是参考。我试图弄清楚 Rx 是什么。我认为从发布这个问题以来我一直在阅读的内容是它只是在线程中运行查询。我仍然不明白所有的炒作是关于什么的,但我确信这仅仅是因为我不明白它是什么。
  • 如果您想对集合中的更改做出反应,最好使用ObservableCollection,请参阅stackoverflow.com/questions/4279185/…
  • 关于何时使用 RX 的一些指导:introtorx.com/content/v1.0.10621.0/01_WhyRx.html。当您需要对查询应用时间因素时,反应式扩展真的很出色,例如,如果您有一个以整数作为参数的事件,您可以创建查询以获取最后 x 分钟内事件的所有整数值等.
  • ObservableCollection 没有实现 IObservable。它不再像 List 那样兼容 Rx。

标签: c# system.reactive


【解决方案1】:

Rx 并非用于监控集合中的状态变化。 ToObservable 方法只是生成一个新的可观察流,其中包含您调用它时集合的内容。

如果您想让 Rx 运算符对集合进行操作,请查看 DynamicData project

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2017-07-25
    • 2013-06-20
    • 2011-02-10
    • 2011-08-27
    相关资源
    最近更新 更多