IIRC、.NET 4.0はすでにこれを行いIEnumerableをため.Zip()
拡張メソッドを持つことになります。
一方、あなた自身のものを作ることはそれほど難しいことではありません。驚いたことに、他のいくつかの答えは非常に近いものの、すべてに少なくとも1つの問題があります。うまくいけば彼らは訂正されるでしょう。その間に、これはあなたが望むことをVBで行うべきです。不明な種類の正しい比較を使用して、強く型付けされた列挙子を持つネット、、、、正しく列挙子の処分:
:
Using xe As IEnumerator(Of X) = List1.GetEnumerator(), _
ye As IEnumerator(Of Y) = List2.GetEnumerator()
While xe.MoveNext() AndAlso ye.MoveNext()
If xe.Current.Equals(ye.Current) Then
''// do something
End If
End While
End Using
そして今、あなたがに独自のデリゲートを渡すことができる機能にこれを入れてみましょう
Public Shared Sub ZipAction(Of X, Y)(ByVal source1 As IEnumerable(Of X), ByVal source2 As IEnumerable(Of Y), _
ByVal compare As Func(Of X, Y, Boolean), Byval OnEquals As Action(Of X, Y))
Using xe As IEnumerator(Of X) = source1.GetEnumerator(), _
ye As IEnumerator(Of Y) = source2.GetEnumerator()
While xe.MoveNext() AndAlso ye.MoveNext()
If compare(xe.Current, ye.Current) Then
OnEquals(xe.Current, ye.Current)
End If
End While
End Using
End Sub
そして最後に、それらのデリゲート型は.NET 3.5までは利用できませんので、あなたは簡単にこのように.NET 2.0でそれらを宣言することができます、このコードを使用するには
Public Delegate Sub Action(Of T1, T2) (_
arg1 As T1, _
arg2 As T2 _
)
Public Delegate Function Func(Of T1, T2, TResult) (_
arg1 As T1, _
arg2 As T2, _
) As TResult
yと
Public Class X
Public Item As String
''//...
End Class
Public Class Y
Public Item As String
''//...
End Class
Public Class Test
Private Function CompareXtoY(ByVal arg1 As X, ByVal arg2 As Y) As Boolean
Return arg1.Item = arg2.Item
End Function
Private Sub OnList1ItemMatchesList2Item(ByVal arg1 As X, ByVal arg2 As Y)
''// Do something...
End Sub
Private list1 As List(Of X) = GetXList()
Private list2 As List(Of Y) = GetYList()
Public Sub TestZip()
ZipAction(list1, list2, AddressOf CompareXtoY, AddressOf OnList1ItemMatchesList2Item)
End Sub
End Class
これは、C#だったら、私は関数は反復子ブロックでなければなりませんし、「降伏リターン」の各マッチングペアをではなく、アクションデリゲートに渡すかを尋ねる:このような何かをou'd。
はい、あなたは絶対に正しいです。 LINQは面倒な手間を省きます。 アップグレードのためにプッシュしてください! .NET 3.5と.NET 2.0はうまくいっています。 – Randolpho