2016-08-04 26 views
1

Ich möchte die folgende Implementierung in eine mehr deklarative Ansatz bereinigen, hoffentlich gibt es einen Rx-Operator, der mir fehlt.Gruppieren von Array-Elementen in Rx

Ich habe ein Array von Daten auf einem Stream veröffentlicht, so etwas wie dieses:

var data = new[] { 'A', 'A', 'C', 'A', 'A', 'A', 'A', 'B', 'C', 'C' }; 

Und ich möchte Gruppenelemente in den Daten in ein Array, bis die Änderung, so dass Sie das Ergebnis wäre:

var result = new[] { { 'A', 'A' }, {'C' }, { 'A', 'A', 'A', 'A' }, { 'B' }, { 'C', 'C' } }; 

Ich habe Folgendes, und ich möchte die 'Select' Implementierung zu bereinigen. Idealerweise mit einem Rx-Operator (z. B. GroupByUntil).

Wie kann dies verbessert werden?

Antwort

3

Wenn der Eingabestream in einen Strom von Zeichen mit .ToObservable konvertiert wird. Die folgende Implementierung ist möglich:

var data = new[] { 'A', 'A', 'C', 'A', 'A', 'A', 'A', 'B', 'C', 'C' }; 

    var publishedData = data 
     .ToObservable() 
     .Publish() 
     .RefCount(); 

    publishedData 
     .GroupByUntil(e => e, e => e, g => publishedData.Where(i => i != g.Key)) 
     .Select(g => g.ToArray()) 
     .Merge() 
     .Subscribe(groupedItems => 
     { 
      Console.WriteLine("{0} - {1}", groupedItems.First(), groupedItems.Count()); 
     }); 

Die .Publish().RefCount() ist für die Schlusssequenz in dem .GroupByUntil Operator benötigt.