【发布时间】:2013-07-11 21:11:24
【问题描述】:
我有一个类ObservableCollection<T>,它代表一个不断变化的集合:
public interface IObservableCollection<T> : IObservable<IEnumerable<T>>
{
void Add(T item);
void Remove(T item);
}
添加或删除项目时,Subject<IEnumerable<T>> 内部会调用其 OnNext 方法,该方法使用新的 IEnumerable<T> 调用,该方法通过 IObservableCollection<T> 的 Subscribe 方法公开。
我还有一门课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 从集合中删除,我想阻止他的位置更新被包括在内。我该怎么做?
【问题讨论】:
标签: c# system.reactive reactive-programming