如何在一个循环中设置多个IObserver



我有一个项目集合,每个项目都有一个IObserver,还有一个生成Messages(!)的消息源。我想过滤消息,只向每个项目发送相关的消息。我认为这很适合System。Reactive的linq。下面是一个例子:

IObservable<Message> source;
foreach(item in items)
{
   var filtered = from msg in source
                  where msg.Id == item.Id
                  selct msg;
   filtered.Subscribe(item.Sink);
}

问题是,当源生成消息时,将根据循环中的最后一个item来评估查询。因此,如果有二十个item,则每个查询将针对item 20的属性。

我该如何解决这个问题?

试试这个:

IObservable<Message> source;
foreach(item in items)
{
   var item2 = item;
   var filtered = from msg in source
              where msg.Id == item2.Id
              selct msg;
   filtered.Subscribe(item2.Sink);
}

我认为这可能会有所帮助。我认为这一切都是因为范围界定。

以下是我认为在您的代码中发生的情况。由于linq查询的求值为lazy,因此查询将始终使用变量item,并且当您进入循环时,该变量上次设置为集合中的最新项。通过在循环开始时将值分配给另一个值,每个查询将针对该变量工作,而该变量在每次迭代中都不会更改。

相关内容

  • 没有找到相关文章

最新更新