私が知る限り、「公式」実装はありません。ほとんどの場合、2つのソースから値を収集し、反対側のソースに一致するものがあるかどうかをチェックする必要があります。このような何かが、あなたが始める必要があります。
<Extension()>
Public Function Intersect(Of T)(first As IObservable(Of T),
second As IObservable(Of T),
comparer As IEqualityComparer(Of T)
) As IObservable(Of T)
If first Is Nothing Then Throw New ArgumentNullException("first")
If second Is Nothing Then Throw New ArgumentNullException("second")
If comparer Is Nothing Then Throw New ArgumentException("comparer")
Return Observable.Create(Of T)(
Function(obs)
Dim gate As New Object()
Dim firstItems As New HashSet(Of T)(comparer)
Dim secondItems As New HashSet(Of T)(comparer)
Dim firstCompleted, secondCompleted As Boolean
Dim disp As New CompositeDisposable(2)
disp.Add(first.Subscribe(Sub(v)
SyncLock gate
firstItems.Add(v)
If secondItems.Contains(v) Then obs.OnNext(v)
End SyncLock
End Sub,
AddressOf obs.OnError,
Sub()
SyncLock gate
firstCompleted = True
If secondCompleted Then obs.OnCompleted()
End SyncLock
End Sub))
disp.Add(second.Subscribe(Sub(v)
SyncLock gate
secondItems.Add(v)
If firstItems.Contains(v) Then obs.OnNext(v)
End SyncLock
End Sub,
AddressOf obs.OnError,
Sub()
SyncLock gate
secondCompleted = True
If firstCompleted Then obs.OnCompleted()
End SyncLock
End Sub))
Return disp
End Function)
End Function
を入力し、複数のoccurrancesが含まれている場合、この実装では、マッチを繰り返すことになりますが、それは両方のソースで発見された後にのみ。たとえば、
first ----1---2---1----2---1---1----|
second ----------2----1-----------|
out ----------2----1-2---1---1----|
繰り返しが望ましくない場合は、対応するソースコレクションにないことを確認できます。最初のサブスクリプションは、
first.Subscribe(Sub(v)
SyncLock gate
'check that the first doesn't already contain this value
If firstItems.Add(v) AndAlso
secondItems.Contains(v) Then obs.OnNext(v)
End SyncLock
End Sub,
AddressOf obs.OnError,
Sub()
SyncLock gate
firstCompleted = True
If secondCompleted Then obs.OnCompleted()
End SyncLock
End Sub)
に変更され、2番目のサブスクリプションは同様に変更されます。
感謝。これはうまくいく。 – Damian