我有一个项目集合,每个项目都有一个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
,并且当您进入循环时,该变量上次设置为集合中的最新项。通过在循环开始时将值分配给另一个值,每个查询将针对该变量工作,而该变量在每次迭代中都不会更改。