如何筛选子可观察量至少具有 x 项的可观察量



给定具有IObservable子属性的对象的IObservable,我如何过滤主要可观察量以仅包含子属性至少具有X个项目的实例。

例如,下面的测试用例有一个包含 2 个 MyClass 的 IObservable。第一个包含 5 个整数的可观察量,第二个包含 2 个整数的可观察值。所以我的问题是如何过滤 MyClass 的 IObservable 以仅包含包含 4 个或更多数字的实例?

[TestClass]
public class TestClass
{
    public class MyClass
    {
        public IObservable<int> Numbers { get; set; }
    }
    [TestMethod]
    public void Test()
    {
        //Arrange       
        var data = new []
        {
            new MyClass()
            {
                Numbers = new Observable.Range(100, 5)
            },
            new MyClass()
            {
                Numbers = new Observable.Range(200, 2)
            }
        };
        var observableData = data.ToObservable();
        //Act
        //TODO: set filtered so that it includes
        // all instances of MyClass which have 4
        // or more items in Numbers
        IObservable<List<MyClass>> filtered = observableData
        //Assert
        IObservable<List<MyClass>> observableResult = 
            filtered.Aggregate(new List<MyClass>(), 
                (l, o) => 
                    { 
                        l.Add(o); 
                            return l; 
                    });
        var result = observableResult.Wait();
        //expected result should include data[0] because
        // is contains 5 numbers but exclude data[1] 
        // because it only contains 2.
        var expected = new List<MyClass>() { data[0] };
        CollectionAssert.AreEquivalent(expected, result);
    }
}

任何帮助,不胜感激。

解决方案:

IObservable<MyClass> filtered = observableData
    .SelectMany(c => c.Numbers
        .Skip(3)
        .Take(1)
        .Select(_ => c)
    );

英语:对于MyClass的每个实例,生成一个跳过前 3 个数字的可观察量,然后取一个。将获取编号映射到MyClass的原始实例。我们使用SelectMany将生成的可观察量扁平化为一个。

相关内容

  • 没有找到相关文章

最新更新