Necesito implementar una versión de CombineLatest
(la llamaré WithLatest
aquí) que llama al selector para cada elemento a la izquierda y el último elemento a la derecha. No debería presionar para que los artículos de la derecha cambien solamente.CombineLatest, pero solo presione para la izquierda
Creo que si esto está construido Observable.Create
o una combinación de extensiones existentes no es particularmente importante; Voy a hacer de esto un método de extensión "en caja" de cualquier manera.
Ejemplo
var left = new Subject<int>();
var right = new Subject<int>();
left.WithLatest(right, (l,r) => l + " " + r).Dump();
left.OnNext(1); // <1>
left.OnNext(2); // <2>
right.OnNext(1); // <3>
right.OnNext(2); // <4>
left.OnNext(3); // <5>
debe ceder
2 1
3 2
Editar: La lógica de mi ejemplo va:
- izquierda se puebla con 1. Derecho está vacía, no hay valores empujados
- Izquierda se actualiza con 2 (olvida el valor anterior). La derecha todavía está vacía, por lo que no se empuja nada.
- La derecha se rellena con 1, por lo que se pulsa Izquierda = 2 (el último valor), Derecha = 1. Hasta este punto, no hay diferencia entre
WithLatest
yCombineLatest
- Se actualiza el derecho - no se empuja nada. Esto es lo que es diferente
- La izquierda se actualiza con 3, por lo que se empuja a la izquierda = 3, a la derecha = 2 (el último valor).
Se ha sugerido que trato:
var lr = right.ObserveOn(Scheduler.TaskPool).Latest();
left.Select(l => l + " " + lr.First()).Dump();
pero esto bloquea en el subproceso actual para mi prueba.
¿Desea hacer esto solo con combinators existentes, o es una implementación usando 'Create()' una opción? –
Su ejemplo no coincide con lo que esperaría de su descripción. El primer elemento devuelto en su ejemplo parece ser desencadenado por un cambio en la derecha observable. ¿Debería activarse 'WithLatest' en la primera derecha si ya hay artículos de la izquierda? –
@Gideon Engelberth: De acuerdo. Eso me dejó perplejo también. De acuerdo con la descripción, el algoritmo debería producir "3 2" solamente. – 3dGrabber