Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 行为主体行为来自IObservable_C#_.net_System.reactive - Fatal编程技术网

C# 行为主体行为来自IObservable

C# 行为主体行为来自IObservable,c#,.net,system.reactive,C#,.net,System.reactive,我希望获得与从BehaviorSubject从IObservable获得的行为相同的行为 当我执行.Take(1)时,我希望它返回“默认值”,直到基础IObservable更改它。基本的IObservable“泵”一次并完成 我不希望实际使用行为主体(这会使它变得微不足道),因为我认为这是一种糟糕的形式 这可能吗?公共静态IObservable行为(IObservable源) public static IObservable<T> Behaviour<T>(IObser

我希望获得与从
BehaviorSubject
IObservable
获得的行为相同的行为

当我执行
.Take(1)
时,我希望它返回“默认值”,直到基础
IObservable
更改它。基本的
IObservable
“泵”一次并完成

我不希望实际使用
行为主体
(这会使它变得微不足道),因为我认为这是一种糟糕的形式

这可能吗?

公共静态IObservable行为(IObservable源)
public static IObservable<T> Behaviour<T>(IObservable<T> source)
{
    return Observable.Return(default(T)).TakeUntil(source).Concat(source);
}
{ 返回可观察。返回(默认值(T)).TakeUntil(源)。Concat(源); }
如果希望流始终具有初始值,则可能需要使用
.StartWith()
方法

在引擎盖下,除了没有
.TakeUntil()
之外,这将做一些与Lee的答案非常相似的事情


如果您希望订阅者立即收到最后一个值,您可能需要将其与
.Replay(1)
结合使用。

如果
行为主题
完全符合您的要求,为什么它是不好的形式?如果你愿意,它可以被公开为一个
IObservable
。@MatthewFinlay-这只是个人的观点,但是订阅
IObservable
只是为了在
中注入
主题
。subscribe
方法并不真正适合将
IObservable
链接在一起的RX范例
Subject
s应该只在你的接收链IMO的最开始处。如果它是一个热可观察对象,并且有人在源启动后订阅,那么它的行为就不会完全像
BehaviorSubject
。他们不会立即得到一个值,而
BehaviorSubject
会立即返回最新的值。所以我的答案是:
observable.StartWith(defaultValue)。Replay(1)
。对于任何正在寻找的人,请注意这将是热的,因此需要适当处理。