如何同时循环两个列表?

问题描述:

我在以下问题处提及以下问题: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

@Dean:我没有什么可以使用的。这太复杂了,我现在正在使用.Net 4。 Zip会起作用,但我如何设置那里的状况?另外,我正在使用列表,而不是IEnums。你能让我知道这样做的正确方法吗? – CodingInCircles 2011-04-12 09:33:10

+0

请记住,要在IEnumerator(Of ListA)上执行操作,您只需调用ListA.GetEnumerator()(显然这两个列表)。我添加了一个编辑来说明如何使用Zip – Dean 2011-04-12 13:20:50

+0

我很抱歉,但是我意识到我根本不需要这个。我以不同的方式解决了这个问题。非常感谢!在这个过程中学到了很多东西。 – CodingInCircles 2011-04-14 12:19:28

你的问题表明你需要一个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是专门为这项工作建立的正确工具。

+0

+1这是正确的,只要你想要测试每个可能的组合是否相等,而不仅仅是两个列表中匹配索引位置的组合。我不能决定从被通缉的问题出发“{0,1,2}”和“{2,0,1}”是否应报告没有匹配或三个匹配?你的回答报告三个匹配0 = 0 1 = 1和2 = 2。 @Akshay,你想要哪个? – MarkJ 2011-04-12 16:31:59

我的问题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 
+0

谢谢!我现在每个使用嵌套,但它没有工作得太好.. :(将尝试邮编,看看.. – CodingInCircles 2011-04-12 09:19:11

+0

谢谢!:)将尝试这一点,让你知道。谢谢! – CodingInCircles 2011-04-12 13:36:46

+0

因此,这将返回一个IEnumerable的布尔值,指示每一对是否相等?这个问题的“做些什么”部分呢?你将如何“在这里做点什么”? – MarkJ 2011-04-12 16:28:37

在.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 
+0

我试过Zip,但是如何指定相等条件?如果可以给我语法,我很乐意尝试那么,我自己尝试了一些东西,没有工作,有什么帮助吗? – CodingInCircles 2011-04-12 11:55:56

+0

@Akshay不是我的回答吗?如果t.Item1 = t.Item2然后做一些事情[与t.Item1或t.Item2一起,推测' – MarkJ 2011-04-12 16:26:44

在解决方案是必须与从第二个列表,然后循环项目的字典,通过你的第一个列表,并在第二个取回相应的项目,使用字典。这里有一个例子,假设你想用一个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