c# - 两个流的条件配对 - 在响应式扩展中组合 If

标签 c# .net linq system.reactive

我希望将前两个序列结合起来,如大理石图所示

CoincidenceWhere

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

期望的输出

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

接收解决方案?

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

最佳答案

您选择的玩家颜色和数字颜色让事情变得有点困惑。

尽管如此,这对我有用。

开头:

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");

这是我得到的结果:

results

关于c# - 两个流的条件配对 - 在响应式扩展中组合 If,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30801436/

相关文章:

c# - 在 DLL 上使用 WPF 动态创建图像(而不是 GDI+)

C# 内存配置文件

C# 泛型接口(interface)协方差

c# - ContentType.Xml 不存在?

java - 如何以编程方式查找传入 http 请求的地理位置?

c# - 如何使用linq找到最小值

c# - 有类型<>/无类型设计

c# - 使用 SpecFlow 或任何其他框架测试所有可能的用户交互排列

C# 连接两个数组的字符串

c# - Entity Framework 在应该执行内部联接时生成左外部联接(多个表)