我在Using foreach loop to iterate through two lists提到了以下问题。关于所选择的答案,我的问题是这个:o.DoSomething可以进行比较吗?如:
For Each a in ListA.Concat(ListB)
If(a from ListA=a from ListB) Then
Do Something here
End If
Next
正如您可能已经猜到的那样,我正在使用VB.Net并且想知道我如何能够完成我在此处展示的内容。这基本上是单独/独立地遍历连接列表。谢谢!
答案 0 :(得分:4)
您的问题表明您需要Join
操作,因为并不是您希望迭代两个列表,但您还希望将一个列表中的相同项目匹配到另一个列表。
Dim joinedLists = From item1 In list1 _
Join item2 In list2 _
On item1.Bar Equals item2.Bar _
Select New With {item1, item2}
For Each pair In joinedLists
'Do work on combined item here'
'pair.item1'
'pair.item2'
Next
其他答案建议Zip
。这只是一个函数,它接受两个序列并产生一个结果,就像连接一样,但它适合在两个列表的FIFO方法中工作。如果您需要基于相等性建立的连接,Join
是专门为此工作而构建的正确工具。
答案 1 :(得分:1)
我的问题is-it-possible-to-iterate-over-two-ienumerable-objects-at-the-same-time的答案可能会有所帮助
Dim listA As List(Of A)
Dim listb As List(Of B)
listA.Zip(listb, Function(a, b) a.property1 = b.property1).ForEach(AddressOf Print)
Shared Sub Print(ByVal s As A)
Console.WriteLine(s.Property1)
End Sub
答案 2 :(得分:0)
在.Net 4中,您可以使用Zip。根据我对来自Python粉丝的this question的回答改编而来,特别要求tuples - 如果愿意,可以删除元组。
Sub Main()
Dim arr1() As String = {"a", "b", "c"} '' will also work with Lists
Dim arr2() As String = {"1", "2", "3"}
For Each t In TupleSequence(arr1, arr2)
If t.Item1 = t.Item2 Then
'' Do something
End If
Next
Console.ReadLine()
End Sub
Function TupleSequence(Of T1, T2)(
ByVal seq1 As IEnumerable(Of T1),
ByVal seq2 As IEnumerable(Of T2)
) As IEnumerable(Of Tuple(Of T1, T2))
Return Enumerable.Zip(seq1, seq2,
Function(s1, s2) Tuple.Create(s1, s2)
)
End Function
答案 3 :(得分:0)
解决方法是使用包含第二个列表中项目的字典,然后遍历第一个列表并使用字典检索第二个列表中的相应项目。这是一个示例,假设您要比较具有ID属性的项目:
Dim DictB = ListB.ToDictionary(Function(x) x.ID)
For each itemA in ListA
If DictB.ContainsKey(itemA.ID)
'Item is in both lists
Dim itemB = DictB(itemA.ID)
'Do something here
End If
Next