观察其他观察者看不到的价值 - c#

我有一个观察到的发出独特的价值,例如

var source=Observable.Range(1,100).Publish();
source.Connect();

我想从例如观察它的价值两个观察者,但每个观察者仅针对其他观察者未看到的值得到通知。

因此,如果第一个观察者包含值10,则第二个观察者永远不会收到有关10值的通知。

更新资料

我选择@Asti的答案是因为它是第一个,尽管虽然有错误,但它指向正确的方向,并投票赞成@Shlomo的答案。太糟糕了,我无法接受两个答案,因为@Shlomo答案更正确,我非常感谢他在此标签上提供的所有帮助。

参考方案

对于不同的观察者,可观察对象的行为不应该有所不同。更好的方法是为每个观察者提供自己的过滤后的可观察物。

话虽如此,如果您的约束条件要求您在单个可观察的状态下需要此行为-我们可以使用Round-Robin方法。

    public static IEnumerable<T> Repeat<T>(this IEnumerable<T> source)
    {
        for (; ; )
            foreach (var item in source.ToArray())
                yield return item;
    }

    public static IObservable<T> RoundRobin<T>(this IObservable<T> source)
    {
        var subscribers = new List<IObserver<T>>();
        var shared = source
            .Zip(subscribers.Repeat(), (value, observer) => (value, observer))
            .Publish()
            .RefCount();

        return Observable.Create<T>(observer =>
        {
            subscribers.Add(observer);
            var subscription = 
                shared
                .Where(pair => pair.observer == observer)
                .Select(pair => pair.value)
                .Subscribe(observer);

            var dispose = Disposable.Create(() => subscribers.Remove(observer));
            return new CompositeDisposable(subscription, dispose);
        });
    }

用法:

var source = Observable.Range(1, 100).Publish();
var dist = source.RoundRobin();
dist.Subscribe(i => Console.WriteLine($"One sees {i}"));
dist.Subscribe(i => Console.WriteLine($"Two sees {i}"));

source.Connect();

结果:

One sees 1
Two sees 2
One sees 3
Two sees 4
One sees 5
Two sees 6
One sees 7
Two sees 8
One sees 9
Two sees 10

如果您已有观察者列表,则代码将变得更加简单。

与哪些运算符>>兼容 - java

我这里没有什么代码int b=3; b=b >> 1; System.out.println(b); 它可以完美工作,但是当我将变量b更改为byte,short,float,double时,它包含错误,但是对于变量int和long来说,它可以完美工作,为什么它不能与其他变量一起工作? 参考方案 位移位运算符(例如>>)与任何整数类型兼…

>> Python中的运算符 - python

>>运算符做什么?例如,以下操作10 >> 1 = 5有什么作用? 参考方案 它是右移运算符,将所有位“右移”一次。二进制10是1010移到右边变成0101这是5

Python 3运算符>>打印到文件 - python

我有以下Python代码编写项目的依赖文件。它可以在Python 2.x上正常工作,但是在使用Python 3进行测试时会报告错误。depend = None if not nmake: depend = open(".depend", "a") dependmak = open(".depend.mak&#…

剃刀付款集成->如何通过关闭按钮X检测剃刀付款模型是否关闭 - javascript

当用户关闭而无需付款时,我在CI框架中使用Razorpay,请创建razor支付模型,然后取消订单,我希望按状态更改为已取消的状态触发查询。所以我怎么能检测到这一点。我已经通过单击jQuery单击关闭功能但无法使用... javascript大神给出的解决方案 Razorpay提供了JS方法来检测模式关闭。您编写的任何JS代码都不会在结帐页面上运行,因为它是…

做什么->在python中做什么 - python

我今天看到了一个python示例,它使用了->例如,这就是我所看到的:spam = None bacon = 42 def monty_python(a:spam,b:bacon) -> "different:": pass 该代码在做什么?我不太确定我以前从未看过像这样的代码,但我真的没有得到什么 a:spam,b:baco…