Linq 如何在循环中设置多个IOBServer

Linq 如何在循环中设置多个IOBServer,linq,system.reactive,Linq,System.reactive,我有一个项目集合,每个项目都有一个IObserver,还有一个生成消息的消息源(!),我想过滤这些消息,只向每个项目发送相关的消息。我认为这是一个很好的系统。反应的linq。以下是一个例子: IObservable<Message> source; foreach(item in items) { var filtered = from msg in source where msg.Id == item.Id

我有一个项目集合,每个项目都有一个IObserver,还有一个生成消息的消息源(!),我想过滤这些消息,只向每个项目发送相关的消息。我认为这是一个很好的系统。反应的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);
}
IObservable源;
foreach(项目中的项目)
{
var filtered=来自源中的消息
其中msg.Id==item.Id
选择味精;
过滤。订阅(项。接收器);
}
问题是,当源生成一条消息时,查询将根据循环中的最后一个
进行计算。因此,如果有二十个
s,则每个查询都将针对
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);
}
IObservable源;
foreach(项目中的项目)
{
var item2=项目;
var filtered=来自源中的消息
其中msg.Id==item2.Id
选择味精;
过滤。订阅(第2项。接收器);
}
我想这可能会有帮助。我想这一切都是因为范围界定


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

在一个旁注上,据我记忆所及,C#5肯定会发生变化。问题是由于可观察对象的调度。它正在另一个线程上运行,或者正在当前线程上排队。无论哪种方式,在循环完成后都会调用订阅,此时
item
变量被设置为
items
集合中的最后一项。