C# 寻找一种更具声明性的Rx方法来观察项目属性何时更改

C# 寻找一种更具声明性的Rx方法来观察项目属性何时更改,c#,system.reactive,C#,System.reactive,我有一个从接收角度可以观察到的集合,项目也可以观察到(从接收角度) 我希望能够观察集合中项目的属性何时更改,但集合大小可以修改-添加、删除等。发生这种情况时,我希望重新订阅集合中项目的属性 我有可以工作的代码,但我正在寻找一些更优雅的\声明性的东西,而不必使用主题 private\u favorites=newobservedcollection(); ... 公共IObservable收藏夹更改() { var disposable=新的SerialDisposable(); var subj

我有一个从接收角度可以观察到的集合,项目也可以观察到(从接收角度)

我希望能够观察集合中项目的属性何时更改,但集合大小可以修改-添加、删除等。发生这种情况时,我希望重新订阅集合中项目的属性

我有可以工作的代码,但我正在寻找一些更优雅的\声明性的东西,而不必使用主题

private\u favorites=newobservedcollection();
...
公共IObservable收藏夹更改()
{
var disposable=新的SerialDisposable();
var subject=新的subject();
_收藏夹。ObserveCollectionChanged()
.订阅(x=>
{
一次性。一次性=_收藏夹。选择(y=>y.ObservePropertyChanged())
.Merge()
.Select(y=>Unit.Default)
.认购(主题);
});
返回主题;
}       
}
使用
.Switch()
是您所需要的
.Switch()
获取一个
IObservable
并返回一个
IObservable
,该值仅从最新的内部
IObservable
生成值。它处理从外部可观测的先前值取消订阅的所有内容

试试这个:

public IObservable<Unit> FavouritesChanged()
{
    return
        _favourites
            .ObserveCollectionChanged()
            .Select(c =>
                _favourites
                    .Select(y => y.ObservePropertyChanged())
                    .Merge()
                    .AsUnit())
            .Switch();
}
public-IObservable-favoriteschanged()
{
返回
_宠儿
.ObserveCollectionChanged()
.选择(c=>
_宠儿
.Select(y=>y.ObservePropertyChanged())
.Merge()
.AsUnit())
.开关();
}
使用
.Switch()
是您所需要的
.Switch()
获取一个
IObservable
并返回一个
IObservable
,该值仅从最新的内部
IObservable
生成值。它处理从外部可观测的先前值取消订阅的所有内容

试试这个:

public IObservable<Unit> FavouritesChanged()
{
    return
        _favourites
            .ObserveCollectionChanged()
            .Select(c =>
                _favourites
                    .Select(y => y.ObservePropertyChanged())
                    .Merge()
                    .AsUnit())
            .Switch();
}
public-IObservable-favoriteschanged()
{
返回
_宠儿
.ObserveCollectionChanged()
.选择(c=>
_宠儿
.Select(y=>y.ObservePropertyChanged())
.Merge()
.AsUnit())
.开关();
}

您发布的代码有几个问题。我不知道您是否要复制这些问题:

  • 从集合中移除的项不会从可观察流中移除
  • 可观察的流只是
    单位
    值,它不提供关于哪个子对象或哪个子对象的哪个属性被改变的线索。这会让你的每件事都焕然一新,这似乎效率很低

  • @Enigmativity的答案修复了第1项,并且根据发布的信息,这可能是最正确的答案。第2项是一个设计缺陷,您可能需要修复。

    您发布的代码有几个问题。我不知道您是否要复制这些问题:

  • 从集合中移除的项不会从可观察流中移除
  • 可观察的流只是
    单位
    值,它不提供关于哪个子对象或哪个子对象的哪个属性被改变的线索。这会让你的每件事都焕然一新,这似乎效率很低

  • @Enigmativity的答案修复了第1项,并且根据发布的信息,这可能是最正确的答案。第2项是一个设计缺陷,您可能需要修复。

    什么是
    \u最喜欢的
    ?什么是
    AsUnit()
    ?我假设您正在解决它?@Shlomo-不,我从未见过它before@Enigmativity-更改代码,谢谢什么是
    (您最喜欢的
    )以及什么是
    a单位()
    ?我想你是在做什么?@Shlomo-不,我从没见过before@Enigmativity-已更改的代码,谢谢其中任何一个都是代码问题,1-由保留在序列中的订阅处理,即使从集合中删除项目,也会重新创建订阅。2-您假设我关心集合中的哪一项发生了更改,在这种情况下,我不关心,我只是想知道任何成员何时发生了特定行为。这两个都不是代码问题,1-由保留在序列中的订阅负责,即使从集合中删除项目,也会重新创建订阅。2-你假设我关心收藏中的哪一项发生了变化,在这种情况下,我不关心,我只是想知道任何成员何时发生了特定行为。lol-你说得对,我刚刚忘记了上次我需要切换()lol-你说得对,我刚刚忘记了上次我需要切换()的时候