2016-08-15 13 views
1

私はRxフレームワークの新人です。反応フレームワークを使って "A"と "B"の文字列の入力シーケンスを認識するコンソールアプリケーションを作る助けがありたいと思います。反応フレームワークを使ったシーケンス認識

私のコードは、最初の入力シーケンス(ソース)と派生シーケンスを示しています。 "A"と "B"のシーケンスは正しく認識されますが、 "A"と "B"の間に他の文字列がある場合、認識しません。

exmple "A" "C" "B"は有効なシーケンスではありません

ありがとうございます。

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

あなたは最後の二つの観測値をバッファリングし、バッファが含まれていることを確認したいようですが、「聞こえますA "と" B "の順番で?もしそうなら、Buffer()演算子を見ましたか? –

+0

申し訳ありませんが... thanxs ..ですので、私はSequenceEqualのようなものを使って比較する必要がありますか?ありがとう – user322416

+0

とにかく私はそれを試みましたが、実際には新しい値ごとに最後の2つの観測値のリストを持つ必要があります。今、私は2つずつ持っています。 – user322416

答えて

1

これにあなたのderivedクエリを変更してみてください:

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

以上に:

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