Как настроить несколько IObservers в цикле - PullRequest
0 голосов
/ 28 февраля 2012

У меня есть коллекция элементов, каждый из которых имеет IObserver, и источник сообщений, который создает сообщения (!). Я хочу фильтровать сообщения и отправлять только соответствующие элементы каждому элементу. Я думаю, что это хорошо подходит для linq System.Reactive. Ниже приведен пример:

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.

Как мне это исправить?

1 Ответ

2 голосов
/ 28 февраля 2012

Попробуйте это:

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 оценивается как ленивый, запрос всегда будет использовать переменную item, и когда вы входите в цикл, последняя переменная была установлена ​​в последний элемент в коллекции.Присваивая значение другому значению в начале цикла, каждый запрос вместо этого будет работать с этой переменной, которая не будет изменяться в каждой итерации.

...