C# 可观测序列RxC的多个订阅

C# 可观测序列RxC的多个订阅,c#,parallel-processing,reactive-programming,system.reactive,C#,Parallel Processing,Reactive Programming,System.reactive,我正在尝试在.NET中学习Rx框架,并且在应用它的过程中,这是我正在从事的任务之一。下面这个简单的用例解释了我正在尝试的功能 我有一个IEnumerable序列,我需要并行处理它,并对其应用一个函数async函数,该函数根据返回的值返回一个int。在下面的代码中,新序列oddSequence和evenSequence仅在创建原始序列之后创建,因此这里不会发生真正的火灾和遗忘事件。使用Rx解决此问题的正确方法是什么 public void TestRx() { IE

我正在尝试在.NET中学习Rx框架,并且在应用它的过程中,这是我正在从事的任务之一。下面这个简单的用例解释了我正在尝试的功能

我有一个IEnumerable序列,我需要并行处理它,并对其应用一个函数async函数,该函数根据返回的值返回一个int。在下面的代码中,新序列oddSequence和evenSequence仅在创建原始序列之后创建,因此这里不会发生真正的火灾和遗忘事件。使用Rx解决此问题的正确方法是什么

    public void TestRx()
    {
        IEnumerable<string> inputs = new string[] { "T-1", "T-2", "T-3"};

        var sequence = inputs.ToObservable().Select(x => ReturnResult(x)).Merge();

        var oddSequence = sequence.Where(x => (x%2) != 0);
        var evenSequence = sequence.Where(x => (x%2) == 0);

        oddSequence.Subscribe(i => Console.WriteLine($"ODD VALUE {i}"));
        evenSequence.Subscribe(i => Console.WriteLine($"EVEN VALUE {i}"));
    }

    public async Task<int> ReturnResult(string s)
    {
        int result = -1;
        Int32.TryParse(s.Split('-')[1], out result);
        return result;
    }
谢谢你帮了我的忙

这就行了:

private Random random = new Random();

public void TextRx()
{
    new[] {"T-1", "T-2", "T-3"}
        .Select(s => ReturnResult(s).ToObservable())
        .Merge()
        .GroupBy(i => i % 2 == 0)
        .SelectMany(g => g.Select(i => (g.Key, Value: i)))
        .Subscribe(o => Console.WriteLine($"{(o.Key ? "EVEN" : "ODD")} VALUE {o.Value}"));
}

public async Task<int> ReturnResult(string s)
{
    await Task.Delay(random.Next(5000));
    int.TryParse(s.Split('-')[1], out var result);
    return result;
}
它使用ValueTuple,这是一个C7特性。你需要用Nuget抓住它。当然可以使用匿名对象,但我更喜欢ValueTuple。它还使用C7中的out变量和C6中的字符串插值。
你想实现什么?我有一个可观测的序列X,它是并行处理的,我想根据计算出的T值采取具体行动。采取的行动取决于计算的T值。这回答了特定OP的问题,但没有回答标题“可观测序列的多个订阅”中的问题。