c# - 何时使用 IEnumerable 与 IObservable?

标签 c# .net ienumerable system.reactive

如何确定方法是否应返回 IEnumerable<T>IObservable<T>

为什么我会选择一种范式而不是另一种?

最佳答案

类型

  • IEnumerable<T>
    • 您反复从 T 的序列中“拉取”的
  • IObservable<T>
    • T 的序列正在向您“推”

Why would I choose one paradigm over the other?

您通常不会“选择”一种范式而不是另一种范式。通常一个自然而然地脱颖而出成为正确的选择,而另一个则没有任何意义。

例子

考虑以下示例:

  • 一个巨大的 CSV 文本文件每行都有一个项目,您希望一次处理一个项目而不是一次将整个文件加载到内存中:IEnumerable<List<string>>

  • 您正在运行一个 HTTP 网络服务器:IObservable<WebRequest>

  • 您想以广度优先的方式获取树数据结构的节点:IEnumerable<Node>

  • 您正在响应用户界面按钮点击:IObservable<Click>

在每个示例中(尤其是 IObservable<T> 案例),使用其他类型是没有意义的。

但是如果我想使用“其他”类型怎么办...

IObservable<T>IEnumerable<T>

如果某物自然是一个 IObservable<T>但你想把它当作 IEnumerable<T> 来处理,你可以用这个方法做到这一点:

IEnumerable<T> Observable.ToEnumerable(this IObservable<T>)
  • TIObservable<T>“插入” , 它被发送到队列中。
  • 当你试图“拉”一个T来自 IEnumerable<T> ,它会阻塞直到队列不为空,然后出队。

IEnumerable<T>IObservable<T>

如果某物自然是一个 IEnumerable<T>但你想把它当作 IObservable<T> 来处理,你可以用这个方法做到这一点:

IObservable<T> Observable.ToObservable(this IEnumerable<T>)
  • .NET 线程池中的一个线程将反复尝试“拉”一个 T来自 IEnumerable<T> .
  • 每次它“拉”一个T , 它通过 IObservable<T> 将它“推”给你.

关于c# - 何时使用 IEnumerable 与 IObservable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17082255/

相关文章:

c# - 如何避免在构造函数中调用虚函数?

c# - ASP.NET GridView 无法隐藏列

c# - 在 C# 中使用队列?

wpf - IEnumerable<IResult> - caliburn micro

c# - Dispose 与 Iterator block

.net - 将 IEnumerable 变量从 ColdFusion 传递到 .NET

c# - 在 Visual Studio 2010 中使用目标构建时收到大量警告

c# - 在 Windows 服务中执行冗长的初始化

c# - CSC : error CS2001: Source file '.NETPortable,Version=v4.5,Profile=Profile78.AssemblyAttributes.cs' could not be found

c# - Linq 与可空 int 的 sum