2017-09-25 1 views
2

키워드가있는 ReactiveList가 있습니다. 사용자는 해당 목록에서 키워드를 추가하거나 제거 할 수 있습니다. 앱이 사용자가 키워드 중 하나를 입력했는지 확인해야합니다. 이미 유사한 포스트가 있었다 그러나이 계정에 유연한 목록을하지 않습니다 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 of String으로 끝날 수 있을까요?

+0

코드를 수정 해 주실 수 있습니까? '.Buffer (n, 1)'또는'.Any()) 다음에 대괄호가 추가로 붙었습니다. 그럼 너는 [mcve]를 만들어 줄 수 있니? 나는 당신의 코드를 컴파일하고 실행할 수 있기를 원한다. – Enigmativity

+0

@Enigmativity는 내 질문에 시간을 할애 해 주셔서 감사합니다. 예제 코드에서 작은 업데이트를했습니다. 그 사이에 Jon Stødle이 내가 찾던 해답을 제시했습니다. – jtourlamain

+0

걱정할 필요가 없습니다. 앞으로는 [mcve]를 게시하는 것이 좋습니다. 그것은 많은 도움이 될 것입니다. – Enigmativity

답변

4

먼저 오프, 모두 MaxAny에는 각각 선택자와 술어를 취하는 과부하가 있습니다. 이것은 Select의 필요성을 부정합니다.

Observable.Merge 다음은 의 수신 번호 인 ReactiveListChanged 속성을 사용하도록 변경되었습니다. 또한 SelectIEnumerableint s가되도록 변경했습니다. 그것은 단지 더 많은 것을 느꼈다 Right ™.

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.Select으로
  2. 통해 KeyTrigger들 중 하나를 마하 문자열을하자 하나 Observable<string>
  3. IEnumerable<IObservable<string>>에서 관찰 가능한 병합 콤보
  4. 의 가능한 길이의 각각에 대한 관찰을 만들기 같은 것은 IObservable<IObservable<string>> 생산하는 우리 가장 최근의 IObservable<string>IObservable<IObservable<string>>을 구독하려면 Switch을 사용하십시오.
관련 문제