8
votes

Extensions réactives: papillon / échantillon avec intervalle variable

J'ai un iobservable qui produit des valeurs à intervalles aléatoires et je veux accélérer cette séquence. Une chose que j'ai découvert est que la définition de l'opérateur de «code» de l'opérateur n'est pas la même que la mienne.

papillon ne produit que des valeurs après l'intervalle spécifié électronique fort> avec silence (il produit la dernière valeur vue). Je pensais que l'étranglement signifierait de produire des valeurs à l'intervalle spécifié (sauf s'il y a du silence, bien sûr).

dire, je m'attendais à observable.Interval (100). Sélectionnez ((_, i) => i) .throttle (200) pour produire (modulo toute question de performance / chronométrage) les nombres paires, car je vais l'étrangler à "demi-vitesse". Cependant, cette séquence ne produit aucune valeur du tout, car il n'y a jamais une période de silence de la longueur 200.

Donc, j'ai découvert que échantillon réellement le comportement "étranglling" que je veux. Observable.Interval (100). Sélectionnez (((_, i) => i) .Sample (200) produit (à nouveau, modulo toute question de performance / chronométrage) la séquence de nombres pairs.

Cependant, j'ai un autre problème: l'intervalle varie, en fonction de la dernière valeur "échantillonnée". Ce que je veux, c'est écrire un opérateur qui ressemble à ceci: xxx

the intervalleyecteur paramètre produit l'intervalle pour l'échantillon suivant et le premier échantillon ... est soit pris à la première valeur ou à partir d'un paramètre supplémentaire, je m'en fiche.

J'ai essayé de l'écrire, mais j'ai fini par une grande construction compliquée qui n'a pas fonctionné bien. Ma question est que je peux construire ceci à l'aide des opérateurs existants (AKA, avec une doublure one-liner)?


0 commentaires

3 Réponses :


0
votes

n'est pas ce que vous cherchez pour observable.frufferwithtime ?


1 commentaires

BufferwithTime souffre du même défaut que les autres: l'intervalle de temps est constant. Je dois calculer combien de temps attendre de prendre le prochain échantillon de la dernière valeur échantillonnée. Je vais voir si je peux dessiner un diagramme de marbre pour cela ...



6
votes

Autre heures plus tard, et avec quelques heures de sommeil, je l'ai eu. XXX

Ceci fonctionne comme je veux: Chaque fois qu'il produit une valeur x , Il arrête de produire des valeurs jusqu'à ce que intervalleyecteur (x) passe de temps.


0 commentaires

0
votes

Je l'ai fait d'une autre manière et je voudrais le partager avec quiconque est utile.

var random = new Random();
Observable.Return(Unit.Default)
            .SelectMany(_ => Observable.Timer(TimeSpan.FromSeconds(random.Next(1, 6))))
            .TimeInterval()
            .Do(value => Console.WriteLine(value))
            .Repeat()
            .Subscribe();


0 commentaires