代码之家  ›  专栏  ›  技术社区  ›  jtourlamain

验证用户是否键入了带有被动扩展名的ReactiveList中的单词

  •  2
  • jtourlamain  · 技术社区  · 7 年前

    我有一个带有关键字的反应列表。用户可以从该列表中添加或删除关键字。应用程序需要验证用户是否键入了其中一个关键字。 Using Reactive Extension for certain KeyPress sequences?

    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,但这样我就失去了所有订阅。 那么,我怎么能得到一个可以观察到的字符串呢?

    1 回复  |  直到 7 年前
        1
  •  4
  •   Jon G Stødle    7 年前

    首先,两者 Max Any 具有分别接受选择器和谓词的重载。这否定了 Select

    接下来,我更改了 Observable.Merge 使用 Changed 的属性 ReactiveList 哪个是Rx版本 INotifyCollectionChanged . 我还更改了 IEnumerable 属于 int 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. IObservable<string> 发出最后一个 n 用户键入的字符。为每个可能长度的 联合体
    2. IEnumerable<IObservable<string>> 合为一体 Observable<string>
    3. KeyTrigger s到
    4. rangeToMax.Select IObservable<IObservable<string>> 我们使用 Switch IObservable<字符串(>); 这个 IObservable<IObservable<字符串(>)&燃气轮机; 生产。