gpt4 book ai didi

vb.net - 是否可以同时迭代两个 IEnumerable 对象?

转载 作者:行者123 更新时间:2023-12-01 23:23:46 25 4
gpt4 key购买 nike

如果我有一个 List(Of x) 和一个 List(Of y) 是否可以同时迭代两者?

类似

for each _x as X, _y as Y in List(of x), List(of y) 
if _x.item = _y.item then
'do something
end if
next

这些列表的大小可能不同。

我正在使用 .Net2.0,我怀疑这是我的失败,因为我有一种感觉 LINQ 可以通过加入通用 id 上的列表来轻松解决问题。

最佳答案

IIRC,.Net 4.0 将为 IEnumerable 提供一个 .Zip() 扩展方法,该方法已经执行此操作。

与此同时,构建自己的系统并不难。令人惊讶的是,虽然其他几个答案非常接近,但它们都至少有一个问题。希望他们能得到纠正。同时,这应该可以在 VB.Net 中使用强类型枚举器执行您想要的操作,对未知类型使用正确的比较,并正确处理枚举器:

Using xe As IEnumerator(Of X) = List1.GetEnumerator()
Using 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
End Using

现在让我们将其放入一个函数中,您可以将自己的委托(delegate)传递给:

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()
Using 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 Using
End Sub

最后,由于这些委托(delegate)类型在 .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

要使用此代码,您需要执行以下操作:

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#,我会让该函数成为一个迭代器 block 并“yield return”每个匹配对,而不是要求您传入一个 Action 委托(delegate)。

关于vb.net - 是否可以同时迭代两个 IEnumerable 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/981867/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com