【问题标题】:Conditional pairing of two streams - Combine If in Reactive Extensions两个流的条件配对 - 在 Reactive Extensions 中结合 If
【发布时间】:2015-06-12 11:00:03
【问题描述】:

我希望将前两个序列结合起来,就像这个大理石图所描绘的那样

  1. 在此示例中,不同的彩票玩家选择号码,并且 他们选择的数字由小圆点的颜色表示 第一行。
  2. 确定中奖号码时(第 2 行)
  3. 需要确定彩票中奖者(第 3 行输出)。抽奖 获胜者小圆点代表获胜的玩家。

期望的输出

  • 所以对于红色中奖号码来说,不是最新的彩票中奖者,而是第三个黑色中奖者
  • 对于棕色的中奖号码,它是应该放在输出流中的第一个蓝色玩家
  • 对于最后一个红色中奖号码,应该是最后一个中奖的红色号码(白色玩家),而不是第一个红色号码(黑色玩家)
  • 请注意,输出应包含玩家和数字(对象),包括它们的相关属性,例如玩家姓名,以及与中奖号码相关联的中奖金额等(这可以通过使用选择器 Func 来实现)

Rx 解决方案?

  • 我尝试使用 .Zip、.When、.CombineLatest、.Buffer 等,但无法达到预期的效果?
  • API 中有没有可以使用的本机内容,或者哪种自定义组合可以实现所需的输出?

【问题讨论】:

    标签: c# .net linq system.reactive


    【解决方案1】:

    你为球员选择的颜色和数字的颜色让事情变得有点混乱。

    不过,这对我有用。

    开始于:

    var picks = new Subject<KeyValuePair<string, string>>(); // key == number, value = player
    var numbers = new Subject<string>();
    

    然后构建一个按数字选择的字典序列:

    var scanned =
        picks
            .Scan(new Dictionary<string, string>(), (d, kvp) =>
            {
                // You need a new dictionary each time
                var d2 = new Dictionary<string, string>(d);
                d2[kvp.Key] = kvp.Value;
                return d2;
            });
    

    现在使用.Switch() 合并:

    var query =
        scanned
            .Select(d =>
                numbers.Select(n => new
                {
                    player = d[n],
                    number = n
                }))
            .Switch();
    

    就是这样。

    这是运行它的代码:

    query.Subscribe(x => Console.WriteLine(x));
    
    picks.OnNext(new KeyValuePair<string, string>("Brown", "Blue"));
    picks.OnNext(new KeyValuePair<string, string>("Grey", "Green"));
    picks.OnNext(new KeyValuePair<string, string>("Red", "Black"));
    picks.OnNext(new KeyValuePair<string, string>("Grey", "Yellow"));
    numbers.OnNext("Red");
    numbers.OnNext("Brown");
    picks.OnNext(new KeyValuePair<string, string>("Grey", "Black"));
    picks.OnNext(new KeyValuePair<string, string>("Red", "White"));
    numbers.OnNext("Red");
    

    这是我得到的结果:

    【讨论】:

    • 谢谢!你如何只保留字典中的最后 x 个玩家,因为我期望从长远来看会加载,并且众所周知,旧的玩家可以在某个时间点后被丢弃
    • 这将是一个使用IImmutableDictionary&lt;TKey, TValue&gt; 的地方,因为扫描出来的每一个字典都与前一个字典不同。此外,在您设置player = d[n]query 中,如果d 不包含n,您可能需要检查以将player 设置为null
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多