2016-08-15 2 views
1

Ich bin ein Neuling von Rx Framework und ich hätte gerne eine Hilfe bei der Herstellung einer Konsolenanwendung, die die Eingabe-Sequenz der Zeichenfolge von "A" und "B" mit reaktiven Rahmen erkennen.Sequence-Erkennung mit reaktiven Rahmen

Hier ist mein Code, der die ursprüngliche Eingabesequenz (Quelle) und die abgeleitete Sequenz zeigt. Die Sequenz "A" und "B" wird korrekt erkannt, aber ich möchte sie nicht erkennen, wenn ich eine andere Zeichenfolge zwischen "A" und "B" erhalte:

für zB "A" "C" "B" ist keine gültige Sequenz

Vielen Dank.

static void Main(string[] args) 
     { 
      var subj = new Subject<string>(); 
      var source = subj.AsObservable(); 
      source.Subscribe(Console.WriteLine); 
      var derived = from first in source.Where(x => x == "A") 
          from second in source.Where(x => x == "B") 
          select new[] { first, second }; 
      derived.Subscribe(x => Console.WriteLine("Derived: " + x[0] + " " +x[1])); 

      subj.OnNext("A"); 
      subj.OnNext("B"); 
      subj.OnNext("C"); 
      subj.OnNext("D"); 
      subj.OnNext("E"); 
      subj.OnNext("F"); 

      Console.ReadLine(); 
     } 
+0

Es klingt wie Sie die letzten beiden beobachteten Werte puffern wollen und prüfen, ob der Puffer "enthält A "und" B "in dieser Reihenfolge? Wenn ja, haben Sie sich den Operator Buffer() angesehen? –

+0

Nein sorry ... danke ... also muss ich etwas mit SequenceEqual vergleichen? Danke – user322416

+0

Wie auch immer ich es versucht habe, aber ich muss tatsächlich eine Liste der letzten 2 beobachteten Werte bei jedem neuen Wert haben. Jetzt habe ich alle 2 .. – user322416

Antwort

1

Versuchen Sie derived Abfrage dieser Wechsel:

var derived = 
    source 
     .Publish(ss => ss.Zip(ss.Skip(1), (a, b) => new [] { a, b })) 
     .Where(xs => xs.SequenceEqual(new [] { "A", "B" })); 

Oder:

var derived = 
    source 
     .Buffer(2, 1) 
     .Where(xs => xs.SequenceEqual(new [] { "A", "B" }));