观察其他观察者未看到的值

2024-01-10

我有一个可观察的值,它发出独特的值,例如

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

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

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

Update

我选择了 @Asti 的答案,因为它是第一个,尽管有问题,但它指出了正确的方向,并对 @Shlomo 的答案投了赞成票。太糟糕了,我不能接受这两个答案,因为@Shlomo 的答案更正确,我真的很感谢他在这个标签上为我们提供的所有帮助。


对于不同的观察者来说,可观察量不应该有不同的行为;更好的方法是为每个观察者提供自己的过滤可观察值。

话虽这么说,如果您的约束要求您需要在单个可观察中执行此行为 - 我们可以使用循环方法。

    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);
        });
    }

Usage:

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();

Result:

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

如果您已经有了观察者列表,代码就会变得简单得多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

观察其他观察者未看到的值 的相关文章

  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐

  • 加速 mysql 转储和导入 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • AsyncWaitHandle.WaitOne 是否会阻塞 CLR 线程?或者它会创建一个 I/O 完成端口吗?

    我有这个问题 请问AsyncWaitHandle WaitOne阻塞CLR线程 或者它是否创建一个 I O 完成端口 例如 当我运行我的应用程序时 我启动一个任务 A 来初始化一些数据 当新请求到达时 我希望它们等到 A 完成 这样我就可以
  • 识别时间数据的差距

    EDIT 我找到了解决以下问题的方法 但是 它适用于小型数据集 但仍然会在大型数据集上创建错误输出 有人知道为什么吗 我找不到错误 这是代码 df continuous lt unlist lapply split df df ID fun
  • 如何在nginx中禁用http2

    due to this https openradar appspot com 26406397Safari 与 HTTP 2 和表单 POSTS 相关的问题 我想禁用通过 HTTP 2 提供一个网页的功能 所以我只是从相应的 nginx
  • 在函数式程序中获取 I/O

    所以我知道你不能在函数式程序中直接从用户那里获取输入 因为它显然不是纯粹的 但如果用户只有 4 个选项可供选择 这仍然适用吗 例如 如果你要求头发颜色 并且有四种选项可供选择 棕色 黑色 金色 红色 那么它是否仍然不纯 如果用户点击与他们的
  • 结合基于多个条件的观察结果

    目前我正在撰写硕士论文 但是 在多个条件下组合行时遇到一些问题 我在下面说明了我的问题和期望的结果 我希望你可以帮助我 这是我的数据集的示例 df lt data frame userID c 1 1 1 1 1 2 2 3 3 3 3 s
  • 什么是流处理中的背压?

    我开始学习 NodeJS 流似乎是人们经常使用的东西 在我读过的大多数文档中都提到了处理大文件时发生的 背压问题 但我还没有找到这个问题到底是什么的明确解释 我还读到使用管道可以帮助解决这个问题 但是管道到底如何解决背压问题呢 感谢您提前的
  • 向自定义验证器添加错误消息

    我有一个自定义验证器 我试图在失败时输出错误消息 但无法这样做 有人可以告诉我我是否在正确的地方执行此操作 class User lt ActiveRecord Base self table name user attr accessib
  • 当给定“const char *”作为第一个参数时,为什么 C 标准库函数“strchr”返回指向非常量的指针?

    使用 gcc g 成功编译给定的代码示例 没有错误strchr调用 这显然分配了const char to char 我发现了strchr被声明为char strchr const char int 在两个不同的来源pubs opengro
  • 如何向上下文添加透明渐变蒙版

    我正在使用quartz 2d 绘制饼图 我使用图层在底部绘制饼图的反射 我想在反射中添加透明的 alpha 渐变 使其变得越来越透明 直到它变得不可见 有人有主意吗 编辑 更多细节 我的饼图位于 CGLayerRef 中 我首先将此层绘制到
  • 找不到从 cronjob 命令运行的 bash 脚本

    我的 crontab 如下 SHELL bin bash PATH sbin bin usr sbin usr bin MAILTO root HOME 01 04 root home sphinx scripts daily update
  • 最终与易失性保证对象的安全发布

    来自 Java并发实践 一书 为了安全地发布对象 对对象的引用和 对象的状态必须可见 同时其他线程 A 正确构造的对象可以是 安全发布者 从静态初始化器初始化对象引用 将对它的引用存储到易失性字段或 AtomicReference 中 将对
  • 在 Vue.js 应用程序上使用 Google (GIS) 登录

    显然谷歌将停止服务gapi oauth2 我正在尝试使用他们的新 使用 Google 登录 工具 但它们非常令人困惑 项目结构我有一个 Vue 前端 我需要允许用户使用 google 登录 然后 我需要使用 OIDC 服务器流在我的后端对它
  • Django数据库:按相关数据库中最新对象的字段排序

    我在 django 中有两个数据库表 Device 表用于存储实际设备 DeviceTest 表用于存储每个设备的测试检查 对一个设备进行多次测试 class Device models Model created at models Da
  • 在 .net4 上升级到 EF6 - System.Data.MetadataException:指定的架构无效

    我有一个在 net v4 下运行的 asp net 网站 我已从 Entity Framework v5 升级到 v6 02 并且使用 nuget 提供的 EntityFramework v4 dll 在 IIS Express 和 net
  • Java中如何正确获取线程名称?

    我有这个类用于在 Java 中创建线程 package org vdzundza forms import java awt Graphics import java awt Graphics2D public class DrawThre
  • CSS如何使div水平居中

    我正在努力使 div 水平居中 我有以下代码将我的 div 垂直和水平地居中在 body 标记中 但似乎只有垂直部分有效 我怎样才能让水平部分也能工作 提前致谢 body background color 081418 font size
  • 定义一个不可见的类方法是“public”的简写吗?

    我经常看到没有可见性关键字定义的函数代码 例如 class Foo function bar 是不是的简写public功能 省略它是一个好习惯吗 class Foo public function bar 是的你是对的 当您省略可见性修饰符
  • vue.js 应用程序中静态资源的路径

    我正在开发一个基于 vue cli webpack 模板的单页面应用程序 由于我们也必须使用静态资源 因此我们需要在样式表中引用它们 官方文档建议使用绝对路径 如下所示 background image url assets images
  • 观察其他观察者未看到的值

    我有一个可观察的值 它发出独特的值 例如 var source Observable Range 1 100 Publish source Connect 我想观察它的价值 例如两个观察者 但每个观察者仅收到其他观察者未看到的值的通知 因此