У меня есть класс ObservableCollection<T>
, который представляет собой изменяющуюся коллекцию:Удаление вложенных наблюдаемыми из потока
public interface IObservableCollection<T> : IObservable<IEnumerable<T>>
{
void Add(T item);
void Remove(T item);
}
Когда элемент добавляется или удаляется, Внутренне Subject<IEnumerable<T>>
имеет свой метод OnNext
названный новым IEnumerable<T>
, который подвергается воздействию через метод Subscribe
от IObservableCollection<T>
.
У меня также есть класс Person
:
public interface IPerson
{
string Name { get; }
IObservable<int> Position { get; }
}
То, что я хочу сделать, это создать поток IEnumerable<Tuple<string, int>>
, представляющий позицию каждого человека, где человек находится в коллекции. Это, кажется, относительно проста:
var peopleCollectionStream = new ObservableCollection<IPerson>();
var peoplePositions = from people in peopleCollectionStream
from updateList in
(from person in people
select person.Position.Select(pos => Tuple.Create(person.Name, pos)))
.CombineLatest()
select updateList;
теперь я могу подписаться на поток, как так:
peoplePositions
.Subscribe(people =>
{
Console.WriteLine("Something was updated");
foreach (var personTuple in people)
Console.WriteLine("{0} -> {1}", personTuple.Item1, personTuple.Item2);
});
И получить желаемый результат:
var alice = new Person() { Name = "Alice" };
peopleCollectionStream.Add(alice); // Alice -> 0
alice.Move(2); // Alice -> 2
var bob = new Person() { Name = "Bob" };
peopleCollectionStream.Add(bob); // Alice -> 2, Bob -> 0
bob.Move(3); // Alice -> 2, Bob -> 3
Проблема возникает, когда я хочу удалить человека из коллекции и, следовательно, исключить их обновления из потока:
peopleCollectionStream.Remove(bob); // Alice -> 2
bob.Move(4); // Alice -> 2, Bob -> 4
Я хочу остановить обновление положения Боба, если он был удален из коллекции. Как я могу это сделать?
Это действительно интересная концепция, спасибо. Мне нужно будет изучить ее дальше, чтобы узнать, применимо ли это в моей ситуации. Хороший блог тоже – AlexFoxGill