如何同时循环两个列表?

时间:2011-04-12 05:24:12

标签: vb.net list foreach

我在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并且想知道我如何能够完成我在此处展示的内容。这基本上是单独/独立地遍历连接列表。谢谢!

4 个答案:

答案 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