2017-09-25 4 views
2

私はReactiveListキーワードを持っています。ユーザーは、そのリストからキーワードを追加または削除できます。アプリは、ユーザーがキーワードの1つを入力したかどうかを確認する必要があります。 はすでに同様のポストがありましたが、それは、アカウントに柔軟なリストを負いません。 Using Reactive Extension for certain KeyPress sequences?ユーザーがReactive Extensionを使用してReactiveListから単語を入力したかどうかを確認します

var keyElements = new ReactiveList<KeyElement>(); 
IObservable<IObservable<int>> rangeToMax = Observable.Merge(keyElements.ItemsAdded, keyElements.ItemsRemoved).Select(obs => Observable.Range(2, keyElements.Select(ke => ke.KeyTrigger.Length).Max())); 


IObservable<IObservable<string>> detectedKeyTrigger = rangeToMax 
    .Select(n => _keyPressed.Buffer(n, 1)) 
    .Merge().Where(m => keyElements.Where(ke => ke.KeyTrigger == m).Any()); 
//Here I want to end up with IObservable<string> instead of IObservable<IObservable<string>> 
私は反応性リストの変更に要素detectedKeyTriggerたびに再割り当てすることによって、外側IObservableを取り除くことができ

、しかし私はすべての購読を失う。 それでは、Observableの文字列だけで終わることはできますか?

+0

あなたはあなたのコードを修正してくださいことはできますか? '.Buffer(n、1)'の後か '.Any()'の後にブラケットを追加するかのいずれかです。あなたは[mcve]を作ってください。私はあなたのコードをコンパイルして実行できることが大好きです。 – Enigmativity

+0

@Enigmativityは私の質問に時間を費やしてくれてありがとう。私は私のサンプルコードを少し更新しました。その間、JonStødleは​​私が探していた答えを提供しました。 – jtourlamain

+0

心配はいりません。将来、あなたは[mcve]を投稿することが良いでしょう。それはたくさんの助けになります。 – Enigmativity

答えて

4

まず、MaxAnyの両方に、セレクタと述語をそれぞれとるオーバーロードがあります。これは、Selectの必要性を否定します。

次に、Iは、INotifyCollectionChangedの受信バージョンであるReactiveListChangedプロパティを使用するObservable.Mergeを変更しました。私はまたSelectIEnumerableのsに変更しました。それはより多くの右を感じたちょうど™。

var keyElements = new ReactiveList<KeyElement>(); 
IObservable<IEnumerable<int>> rangeToMax = keyElements.Changed 
    .Select(_ => Enumerable.Range(2, keyElements.Max(keyElement => keyElement.KeyTrigger.Length)); 


IObservable<IObservable<string>> detectedKeyTrigger = rangeToMax. 
    .Select(range => range 
     .Select(length => _keyPressed.Buffer(length, 1).Select(chars => new string(chars.ToArray()))) // 1 
     .Merge() // 2 
     .Where(m => keyElements.Any(ke => ke.KeyTrigger == m)) // 3 
    .Switch(); // 4 
  1. 、ユーザが入力した最後のn文字を発するIObservable<string>を作成します。 rangeToMax.SelectIObservable<IObservable<string>>我々を生成のみと
  2. を通じてKeyTrigger秒のいずれかをMACHの文字列を聞かせて1 Observable<string>
  3. IEnumerable<IObservable<string>>で観測をマージコンボ
  4. の可能な長さごとに、このような観測可能の作成Switchを使用して最新のIObservable<string>IObservable<IObservable<string>>を購読するだけです。
関連する問題