C# 开关()后的StartWith(),初始订阅时除外
我有一个C# 开关()后的StartWith(),初始订阅时除外,c#,system.reactive,C#,System.reactive,我有一个IObservable,每当一个不同的IObservable发出一个值时,它就是Switch()ed,如下所示: IObservable<string> Invalidated => stateChanged .Select(state => state.CanExecuteChanged.Select(x => _myString)) .Switch() .StartWith(_myString); IObservable Inv
IObservable
,每当一个不同的IObservable
发出一个值时,它就是Switch()
ed,如下所示:
IObservable<string> Invalidated => stateChanged
.Select(state => state.CanExecuteChanged.Select(x => _myString))
.Switch()
.StartWith(_myString);
IObservable Invalidated=>stateChanged
.Select(state=>state.CanExecuteChanged.Select(x=>\u myString))
.Switch()
.StartWith(_myString);
这里,stateChanged
是一个IObservable
,CanExecuteChanged
是一个IObservable
。换句话说,每次状态改变时,我都会取消订阅该状态的CanExecuteChanged
observable,并订阅新状态提供的observable
问题在于StartWith
。第一次订阅时,我不希望发出值。但是,每次由于状态更改而运行开关时,我都希望发出一个值。否则,不应在Invalidated
的初始订阅上发出值,但在每个开关上发出值,因此,我确实希望发出值。我能做到这一点吗?如果可以,怎么做到?我很确定@Asti就在这里。下面的一些测试表明,通过在投影内移动星体:
初始订阅时不发出任何值
当可观测状态发出新值时,将发出“初始”值
当CanExecuteChanged可见更改时,将发出“更改”值
公共类状态
{
公共状态(IObservable canExecuteChanged)
{
CanExecuteChanged=CanExecuteChanged;
}
公共IObservable CanExecuteChanged{get;}
}
公共类StartWitterSwitch
{
私有IObservable CreateObservable(IObservable状态)
{
返回状态
.Select(s=>s.CanExecuteChanged.Select(=>“已更改”).StartWith(“初始”))
.开关();
}
[测试]
public void shouldnotmmitonitialsubscription()
{
var scheduler=newtestscheduler();
var states=scheduler.CreateColdObservable();
var observed=scheduler.Start(()=>createobserveable(states),TimeSpan.FromSeconds(1.Ticks);
Assert.That(observed.Messages,Is.Empty);
}
[测试]
public void应在声明更改时提交()
{
var scheduler=newtestscheduler();
stateA=新状态(Observable.Never());
var states=scheduler.CreateColdObservable(
新录制的(TimeSpan.From毫秒(500).Ticks,Notification.CreateOnNext(stateA))
);
var observed=scheduler.Start(()=>createobserveable(states),TimeSpan.FromSeconds(1.Ticks);
Assert.That(observed.Messages.Count,Is.EqualTo(1));
Assert.That(observed.Messages[0].Time,Is.EqualTo(TimeSpan.frommilluses(500.Ticks))。在(TimeSpan.frommilluses(1.Ticks)内);
Assert.That(observed.Messages[0].Value.Value,Is.EqualTo(“initial”));
}
[测试]
公共无效应在下一个ECUTECHECHANGES()时终止
{
var scheduler=newtestscheduler();
State stateA=新状态(scheduler.CreateColdObservable(
新录制的(TimeSpan.From毫秒(100).Ticks,Notification.CreateOnNext(true))
));
var states=scheduler.CreateColdObservable(
新录制的(TimeSpan.From毫秒(500).Ticks,Notification.CreateOnNext(stateA))
);
var observed=scheduler.Start(()=>createobserveable(states),TimeSpan.FromSeconds(1.Ticks);
Assert.That(observed.Messages.Count,Is.EqualTo(2));
Assert.That(observed.Messages[0].Time,Is.EqualTo(TimeSpan.frommilluses(500.Ticks))。在(TimeSpan.frommilluses(1.Ticks)内);
Assert.That(observed.Messages[0].Value.Value,Is.EqualTo(“initial”));
Assert.That(observed.Messages[1].Time,Is.EqualTo(TimeSpan.frommilluses(600.Ticks))。在(TimeSpan.frommilluses(1.Ticks)内);
Assert.That(observed.Messages[1].Value.Value,Is.EqualTo(“changed”));
}
}
很确定@Asti就在这里。下面的一些测试表明,通过在投影内移动星体:
初始订阅时不发出任何值
当可观测状态发出新值时,将发出“初始”值
当CanExecuteChanged可见更改时,将发出“更改”值
公共类状态
{
公共状态(IObservable canExecuteChanged)
{
CanExecuteChanged=CanExecuteChanged;
}
公共IObservable CanExecuteChanged{get;}
}
公共类StartWitterSwitch
{
私有IObservable CreateObservable(IObservable状态)
{
返回状态
.Select(s=>s.CanExecuteChanged.Select(=>“已更改”).StartWith(“初始”))
.开关();
}
[测试]
public void shouldnotmmitonitialsubscription()
{
var scheduler=newtestscheduler();
var states=scheduler.CreateColdObservable();
var observed=scheduler.Start(()=>createobserveable(states),TimeSpan.FromSeconds(1.Ticks);
Assert.That(observed.Messages,Is.Empty);
}
[测试]
public void应在声明更改时提交()
{
var scheduler=newtestscheduler();
stateA=新状态(Observable.Never());
var states=scheduler.CreateColdObservable(
新录制的(TimeSpan.From毫秒(500).Ticks,Notification.CreateOnNext(stateA))
);
var observed=scheduler.Start(()=>createobserveable(states),TimeSpan.FromSeconds(1.Ticks);
Assert.That(observed.Messages.Count,Is.EqualTo(1));
Assert.That(observed.Messages[0].Time,Is.EqualTo(TimeSpan.frommilluses(500.Ticks))。在(TimeSpan.frommilluses(1.Ticks)内);
Assert.That(observed.Messages[0].Value.Value,Is.EqualTo(“initial”));
}
[测试]
公共无效应在下一个ECUTECHECHANGES()时终止
{
var scheduler=newtestscheduler();
State stateA=新状态(scheduler.CreateColdObse