由於源供應商象下面這樣:加入未知數量的來源時,所有來源包含給定鍵
IObservable<ISource> Sources();
每個東森光電看起來像下面:
IObservable<IEnumerable<string>> ObserveData(string filter)
我想退:
IObservable<IEnumerable<string>> Results
當從所有ISources返回給定字符串時。基本上我想要所有來源的交集。
如果添加了新來源,則應重新評估所有內容。
我很努力想出一個通用的解決方案。我見過的大多數解決方案都有衆所周知的來源。 任何想法讚賞。
回答 好了之後想了一會兒,我想出了我的答案。可能它可以改進,但它似乎適用於我,所以我會張貼在這裏作爲參考,以防其他人有類似的問題。感謝ibebbs和Shlomo花時間回覆,非常感謝。
//Arrange
var s1 = Substitute.For<ISource>();
s1.ObserveData(Arg.Any<string>()).Returns(Observable.Return(new[] { "a", "b", "c", "d" }));
var s2 = Substitute.For<ISource>();
s2.ObserveData(Arg.Any<string>()).Returns(Observable.Return(new[] { "b", "xx", "c", "d" }));
var s3 = Substitute.For<ISource>();
s3.ObserveData(Arg.Any<string>()).Returns(Observable.Return(new[] { "yy", "b", "ff", "d" }));
var expected = new[] { "b", "d" };
var sources = new[] { s1, s2, s3 }.ToObservable();
var scheduler = new TestScheduler();
var observer = scheduler.CreateObserver<IList<string>>();
//Act
sources.Buffer(TimeSpan.FromMilliseconds(500), scheduler)
.Select(s => Observable.CombineLatest(s.Select(x => x.ObserveData("NoFilter"))))
.Switch()
.Select(x =>IntersectAll(x))
.Do(x => Console.WriteLine($"Recieved {string.Join("," , x)}"))
.Subscribe(observer);
scheduler.AdvanceBy(TimeSpan.FromMilliseconds(500).Ticks);
//Assert
observer.Messages.AssertEqual(
OnNext<IList<string>>(0, s => s.SequenceEqual(expected)),
OnCompleted<IList<string>>(0));
對於IntersectAll,看到Intersection of multiple lists with IEnumerable.Intersect()
是結果屬性或方法?如果一個屬性,過濾器參數應該傳入什麼? – Shlomo