2016-07-22 6 views
0

Ist es möglich, eine für jeden Beitritt zwei Liste zu tun und durchsuchen Sie die neue "Duo-Liste"? so etwas wie:Für jede in Doppel-Liste

For Each elm In list1 Join list2 
    elm.obj1 // objet with list1 type 
    elm.obj2 // object with list2 type 
next elm 

Listen haben die gleiche Länge.

+0

Was bedeutet, haben die gleiche Länge und nur ein Objekt? Also enthalten beide nur ein Objekt? Ist es möglich, dass sie jemals mehr enthalten? Wie willst du ihnen überhaupt beitreten? Über den Index oder über eine andere Logik wie eine gemeinsame ID? Wie ist es mit VB6 verwandt? –

+0

Ich meine mit einem Objekt gibt es kein obj1.etwas möglich, also keine gemeinsame Idee offensichtlich. Via Index ist gut Ich will nur wissen, was die Möglichkeiten –

Antwort

1

Wenn Sie meinen, dass Sie eine einzelne, kombinierte Liste aufzählen wollen, dann würden Sie dies tun:

For Each item In list1.Concat(list2) 
    'Use item here. 
Next 

Wenn das, was Sie tatsächlich bedeuten, ist, dass Sie die Elemente in beiden Listen auf dem gleichen Index zugreifen möchten zur gleichen Zeit, wie würde dann eine For Each Schleife Sinn machen? In diesem Fall würden Sie einen For Schleife verwenden und beide Elemente von Index erhalten:

For i = 0 To list1.Count - 1 
    Dim item1 = list1(i) 
    Dim item2 = list2(i) 

    'Use item1 and item2 here. 
Next 

Unter Berücksichtigung der Zip Methode in der anderen Antwort verwendet und es mit meinem Tuple Vorschlag kombiniert:

For Each tpl In list1.Zip(list2, Function(a, b) AddressOf Tuple.Create) 
    Console.WriteLine(tpl.Item1) 
    Console.WriteLine(tpl.Item2) 
Next 
+0

sind, können Sie 'AddressOf' mit einer Methodengruppe statt mit einem Lambda verwenden:' Zip (list2, AddressOf Tuple.Create) ' – Sehnsucht

+0

@ Sehnsucht, in der Tat. Aktualisiert. – jmcilhinney

4

Sie können durch den Index mit LINQ Enumerable.Zip und erstellen einen anonymen Typ beitreten:

Dim zipped = list1.Zip(list2, Function(obj1, obj2) New With {Key obj1, Key obj2}) 

For Each pair In zipped 
    Console.WriteLine(pair.obj1) 
    Console.WriteLine(pair.obj2) 
Next 

Beachten Sie, dass zipped ist noch keine Sammlung, sondern eine Abfrage. Wann immer Sie es aufzählen (z. B. mit For Each, First, ToList usw.) werden Sie diese Abfrage erneut ausführen. Wenn Sie es persistieren müssen, können Sie eine Liste oder ein Array erstellen (ToList/ToArray) und stattdessen darauf zugreifen. Die faule Auswertung vieler LINQ-Methoden heißt Deferred Execution.

+0

Süß. War sich der 'Zip' bewusst, benutzte sie aber nie. Ich werde mein 'Tuple' Beispiel unten ändern, um es stattdessen zu verwenden. – jmcilhinney

+0

Sie könnten/sollten in der Definition des anonymen Typs 'Key' hinzufügen, um die Felder schreibgeschützt zu machen:' Neu mit {Schlüsselobj, Schlüsselobj2} ' – Sehnsucht

+0

@Sehnsucht: done –