J'ai une classe ObservableCollection<T>
qui représente une collection en évolution:Suppression des observables nichait de flux
public interface IObservableCollection<T> : IObservable<IEnumerable<T>>
{
void Add(T item);
void Remove(T item);
}
Lorsqu'un élément est ajouté ou supprimé, un Subject<IEnumerable<T>>
a en interne sa méthode OnNext
appelé avec IEnumerable<T>
qui est exposée par la méthode Subscribe
de IObservableCollection<T>
.
J'ai aussi une classe Person
:
public interface IPerson
{
string Name { get; }
IObservable<int> Position { get; }
}
Ce que je veux faire est de produire un flux de IEnumerable<Tuple<string, int>>
représentant la position de chaque personne, où une personne est dans la collection. Cela semble relativement simple:
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;
je peux maintenant vous abonner au flux comme ceci:
peoplePositions
.Subscribe(people =>
{
Console.WriteLine("Something was updated");
foreach (var personTuple in people)
Console.WriteLine("{0} -> {1}", personTuple.Item1, personTuple.Item2);
});
Et je reçois la sortie désirée:
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
Le problème se pose quand je veux supprimer une personne de la collection et par conséquent exclure ses mises à jour du flux:
peopleCollectionStream.Remove(bob); // Alice -> 2
bob.Move(4); // Alice -> 2, Bob -> 4
Je veux empêcher les mises à jour de position de Bob d'être incluses s'il a été retiré de la collection. Comment puis-je faire ceci?
Ceci est un concept très intéressant, merci - je vais devoir l'étudier plus loin pour voir si elle est applicable dans ma situation. Nice blog too – AlexFoxGill