如何确定方法是否应返回 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>)
- 当
T
被IObservable<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/