2011-04-12 66 views
0

我在以下問題處提及以下問題: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

回答

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是專門爲這項工作建立的正確工具。

+0

+1這是正確的,只要你想要測試每個可能的組合是否相等,而不僅僅是兩個列表中匹配索引位置的組合。我不能決定從被通緝的問題出發「{0,1,2}」和「{2,0,1}」是否應報告沒有匹配或三個匹配?你的回答報告三個匹配0 = 0 1 = 1和2 = 2。 @Akshay,你想要哪個? – MarkJ 2011-04-12 16:31:59

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 
+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

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 
+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

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