ObservableCollection<T>
変化するコレクションを表すクラスがあります。
public interface IObservableCollection<T> : IObservable<IEnumerable<T>>
{
void Add(T item);
void Remove(T item);
}
アイテムが追加または削除されると、内部的に aのメソッドSubject<IEnumerable<T>>
が、 のメソッドを通じて公開されるOnNext
new で呼び出されます。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
ボブがコレクションから削除された場合、ボブの位置の更新が含まれないようにしたいと考えています。これどうやってするの?