c# - react 性扩展 : Zip operator but different

标签 c# system.reactive

这不是现实生活中的例子(这段代码可能无法编译)但我试图让它比我实际遇到的问题简单一点。

假设我有图像集合:

private void IEnumerable<Image> GetImages()
{
    foreach (var filename in GetFilenames())
    {
         yield return Image.LoadFile(filename);
    }
}

我想展示由用户按“空格”驱动的幻灯片:

var images = Observable.FromEvent(form, "KeyPress")
  .Where(e => e.KeyCode == KeyCode.Space)
  .Zip(GetImages.ToObservable(), (k, i) => i);

还有这种作品。当按下空格时,它会发出下一张图像。问题是它实际上以全速加载它们,因此它们会被缓冲并消耗大量内存(以及加载时的处理能力)。 我可以将过滤按键输入到 GetImages 并在那里进行压缩,但我不会保留 GetImages 的纯度。

有什么办法可以防止enumerable.ToObservable()在不需要的情况下被提前枚举?

另一个例子(这个会编译):

var observable = 
    Observable.Interval(TimeSpan.FromSeconds(1))
    .Zip(
        Observable.Range(0, 1000000).Do(x => Console.WriteLine("produced {0}", x)), 
        (_, v) => v
    );

var subscription = observable.Subscribe(x => Console.WriteLine("consumed {0}", x));

Console.WriteLine("Press <enter>...");
Console.ReadLine();

它会产生很多“produced”(提前)但每秒只有一个“consumed”。

最佳答案

Dave 坚持从 IEnumerable<T> 中提取图像的想法是可靠的,但您可以更轻松地实现相同的目标 - 只需删除 ToObservable()从你的代码:

var images = Observable.FromEvent(form, "KeyPress")
                       .Where(e => e.KeyCode == KeyCode.Space)
                       .Zip(GetImages() /* No ToObservable() here! */, (k, i) => i);

Zip 的这种重载将在您按键时驱动图像可枚举。

关于c# - react 性扩展 : Zip operator but different,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26246772/

相关文章:

c# - 为什么 XPath 表达式在 C# 中不返回任何结果,但在 C# 之外却返回任何结果?

c# - 调用 MakePredictionFunction 时“无法确定成员特征的 IDataView 类型”

c# - ObserveOnDispatcher 不调用 UI 线程中的处理程序

c# - 使用 Rx,如何在我的订阅方法运行时忽略除最新值之外的所有值

c# - 在前提完成之前继续运行

c# - 从基类 C# 调用子类方法

c# - 使用成员作为实现者实现接口(interface)

c# - Observable<string> 更新事件?

c# - 使用一个可观察量来同步另一个可观察量

c# - 使用 IObservable (Rx) 作为 MVVM 的 INotifyCollectionChanged 替代品?