system.reactive Compartiendo una sola suscripción (Publicar)


Ejemplo

Dado un IObservable<Offer> de offers de comerciantes para comprar o vender algún tipo de artículo a un precio fijo, podemos emparejar pares de compradores y vendedores de la siguiente manera:

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));

El problema con esto es que cada suscripción a las trades se suscribirá a las offers dos veces. Podemos hacer que los sellers y buyers compartan una única suscripción a las offers utilizando 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));
});