2016-12-03 5 views
2

So habe ich diesen Strom von Strings wie folgt aus:Distinct Reset nach Buffer

ABA  ABCA 
+--------+-------+ 
0  1  2 s 

Ich mag würde die unterschiedlichen Werte bekommen, puffern sie für eine Sekunde und dann diese wieder von vorn zu tun. So würde Ich mag 2 Sätze von Daten haben, angesichts der Abbildung oben:

AB und ABC

ich damit begonnen:

void Main() 
{ 
    var subject = new Subject<string>(); 

    var subscription = subject 
    .Distinct() 
    .Buffer(TimeSpan.FromSeconds(1)) 
    .Subscribe(eg => 
     { 
      eg.Dump(); 
     } 
    ); 

    subject.OnNext("A"); 
    subject.OnNext("B"); 
    subject.OnNext("A"); 

    Console.ReadLine(); 

    subject.OnNext("A"); 
    subject.OnNext("B"); 
    subject.OnNext("C"); 
    subject.OnNext("A"); 

    Console.ReadLine(); 

    subscription.Dispose(); 
} 

aber diese gibt AB, bevor ich eine Zeile in der ersten eingeben Console.ReadLine() und dann C danach.

Ich möchte den Distinct() - Operator nach jeder Pufferzeit zurückgesetzt. Ist das möglich?

Natürlich kann ich dies tun, und habe es funktioniert:

var subscription = subject 
    .Buffer(TimeSpan.FromSeconds(2)) 
    .Select(s => s.Distinct()) 
    .Subscribe(eg => 
    { 
     eg.Dump(); 
    }); 

Aber ich frage mich, ob es mit Hilfe von Operatoren Rx getan werden kann.

Antwort

2

Die Lösung, die Sie am Ende haben, sollte gut funktionieren. Wenn Sie mit IObservable in Rx Land bleiben wollen, sollten Sie auf die Window Betreiber wechseln:

var subscription = subject 
    .Window(TimeSpan.FromSeconds(1)) 
    .Select(o => o.Distinct()) 
    .Merge() 
    .Subscribe(eg => 
     { 
      eg.Dump(); 
     }); 
+0

Dank. Ich habe bereits mit 'GroupBy()' gespielt, aber das hat nicht so gut funktioniert. –