Unlike IObservable<T>.Merge, IObservable<T>.CombineLatest does not require the merged observable collections to be of the same type.
Like IObservable<T>.Zip, IObservable<T>.CombineLatest combines ‘pairs‘ of values from the two observable collections, but unlike Zip when a new value becomes available on one collection it does not wait till a new value to be available on the other collection, instead it takes whatever the latest value is from the other collection (provided there is one):
Again, like the Merge method, you can either invoke CombineLatest as an extension method:
var zs = xs.CombineLatest(ys, (a, b) => a + b);
or you can invoke it as static method:
var zs = Observable.CombineLatest(xs, ys, (a, b) => a + b);