2

I need to know when the latest value from 4 observable streams match a predicate.

For only two streams, I could use CombineLatest with Where.

How would I achieve this with n>2 streams.

Thanks.

Edit: Answer for what I was trying to achieve

void Main()
{
    var s1 = Observable.Interval(TimeSpan.FromMilliseconds(50));
    var s2 = Observable.Interval(TimeSpan.FromMilliseconds(60));
    var s3 = Observable.Interval(TimeSpan.FromMilliseconds(70));
    var s4 = Observable.Interval(TimeSpan.FromMilliseconds(80));

    Observable.CombineLatest(s1, s2, s3, s4)
        .Where(xs => xs.All(x => x > 10 && x < 20))
        .Subscribe(x =>
        {
            x.Dump();
        });
}
Damien Sawyer
  • 5,323
  • 3
  • 44
  • 56

1 Answers1

3

I think you can still use CombineLatest or perhaps I'm missing your requirements.

[TestMethod]
    public void GreaterThan2StreamsCombineLatest()
    {
        //Arrange
        var s1 = Observable.Return(1).Concat(Observable.Return(10));
        var s2 = Observable.Return(2);
        var s3 = Observable.Return(3);

        var expected = "They're all greater than 1";
        var result = string.Empty;

        //Act
        Observable.CombineLatest(s1, s2, s3)
            .Where(xs => xs.All(x => x > 1))
            .Subscribe(x =>
            {
                x.ToList().ForEach(Console.WriteLine);
                result = "They're all greater than 1";
            });

        //Assert
        Assert.AreEqual(expected, result);
    }
user630190
  • 1,142
  • 2
  • 11
  • 26
  • Awesome! I didn't realize there was that overload. Your example is close. I'll post an answer with what I knocked up in Linqpad. Thanks for your time. – Damien Sawyer Dec 09 '15 at 13:01