を与えられたソースの数が不明な参加しますは、以下のようなソースプロバイダ指定されたキー
IObservable<IEnumerable<string>> Results
すべてのISourceから特定の文字列が返された場合。基本的に私はすべてのソースの交差点が必要です。
新しいソースが追加された場合は、すべてを再評価する必要があります。
私はこれに対する一般的な解決策を考え出すのに苦労しています。私が見たほとんどの解決策には、よく知られている情報源があります。 アイデアありがとうございます。
回答 もう一度考えてから、私は答えを思いついた。おそらくそれは上で改善することができますが、それは私のために働くようですので、誰か他の人が同じような問題を抱えている場合に参照するためにここに掲載します。返信する時間をとってくれたibebbsとShlomoに感謝します。 IntersectAllについては
//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));
、これについてどのようにIntersection of multiple lists with IEnumerable.Intersect()
結果はプロパティまたはメソッドですか?プロパティの場合、フィルタ引数として渡されるべきは何ですか? – Shlomo