我有一个ObservableCollection<T>
代表不断变化的集合的类:
public interface IObservableCollection<T> : IObservable<IEnumerable<T>>
{
void Add(T item);
void Remove(T item);
}
当添加或删除一个项目时,在内部 a会使用 new 调用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
如果 Bob 从集合中删除,我想停止包含 Bob 的位置更新。我怎样才能做到这一点?