【发布时间】:2017-04-27 15:20:52
【问题描述】:
给定一个 Observable,它会在调用 Subscribe 后开始推送事件。如何将序列转换为 IEnumerable。
2010 年 Jon Skeet 写了关于他对 RX 的第一印象并写了这篇文章,这将相当于我所需要的。
public static List<T> ToList<T>(this IObservable<T> source)
{
List<T> ret = new List<T>();
source.Subscribe(x => ret.Add(x));
return ret;
}
https://codeblog.jonskeet.uk/2010/01/16/first-encounters-with-reactive-extensions/
虽然此解决方案可行,但似乎应该有更好的方法。
我们真正感兴趣的是能够以类似于订阅的方式await observable。
await observable.ToList()
但是,这似乎对我不起作用。
我也研究过这两种方法
observable.ToEnumerable
observable.Next
更多信息
我打算用它来写一些单元测试。
- 我正在使用
ReplaySubject并使用测试替代品执行一系列操作。 - 通过
OnNext记录对替代者的呼叫。 - 我可以获得调用列表并断言它们是正确的。
【问题讨论】:
-
Jon Skeet 的文章写于 2010 年,当时 Rx 只是一个研究项目,
async/await是未来两年。 By 2011 Observable 有自己的ToList()扩展方法 -
@PanagiotisKanavos 这样您就可以将 IObservable
更改为 IObservable > IObservable<IList<TSource>> ToList<TSource>(this IObservable<TSource> source)MSDN Daniel 正在询问 IObservable到 IEnumerable 的转换 -
@lerthe61 检查 Shlomo 的答案,该答案显示了如何做到这一点。
ToEnumerable()提供了一个阻塞选项。 Jon Skeet 的文章是在 Rx 是一个研究项目时写回来的,不再适用
标签: c# .net system.reactive