如何过滤子 Observable 至少有 x 项的 Observable
How to filter an Observable where child observable has at least x items
给定一个 IObservable 对象,它有一个 IObservable 子对象 属性,我该如何过滤主要的 observable 以仅包括子对象 属性 至少有 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
将生成的 observables 展平为一个。
给定一个 IObservable 对象,它有一个 IObservable 子对象 属性,我该如何过滤主要的 observable 以仅包括子对象 属性 至少有 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
将生成的 observables 展平为一个。