system.reactive Condivisione di un singolo abbonamento (Pubblica)


Esempio

Data una IObservable<Offer> di offers da parte dei commercianti di acquistare o vendere alcuni tipi di articoli ad un prezzo fisso, possiamo abbinare coppie di compratori e venditori come segue:

var sellers = offers.Where(offer => offer.IsSell).Select(offer => offer.Merchant);
var buyers = offers.Where(offer => offer.IsBuy).Select(offer => offer.Merchant);
var trades = Observable.Zip(sellers, buyers, (seller, buyer) => new Trade(seller, buyer));

Il problema con questo è che ogni abbonamento alle trades si iscriverà alle offers due volte. Possiamo fare in modo che sellers e buyers condividano un solo abbonamento alle offers utilizzando Publish :

var trades = offers.Publish(_offers =>
{
    var sellers = _offers.Where(offer => offer.IsSell).Select(offer => offer.User);
    var buyers = _offers.Where(offer => offer.IsBuy).Select(offer => offer.User);
    return Observable.Zip(sellers, buyers, (seller, buyer) => new Trade(seller, buyer));
});