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