Können wir mehrere Variablen in foreach verwenden?

8

Können wir mehrere Variablen in foreach verwenden

? %Vor%

Ich möchte dies tun, weil ich zwei Sammlungen aus einer Datenbank holen und beide an eine ComboBox anhängen muss.

    
Anish 25.01.2013, 06:29
quelle

7 Antworten

12

Verwenden Sie LINQ, um die Arrays zu verbinden, indem Sie das Ergebnis in einen anonymen Typ setzen und dann über die resultierende Sammlung iterieren.

%Vor%

Bearbeiten:

Beim Veröffentlichen der Antwort ging ich davon aus, dass collection1 und collection2 unterschiedliche Typen enthielten. Wenn sie den gleichen Typ oder einen gemeinsamen Basistyp haben, gibt es Alternativen:

Wenn Duplikate zulassen möchten:

%Vor%

Keine Duplikate:

%Vor%

Formularframework ab 4.0 Zip kann die ursprüngliche Lösung ersetzen:

%Vor%

Eine Übersicht über die meisten verfügbaren LINQ-Funktionen finden Sie unter 101 LINQ-Beispiele .

Ohne LINQ verwenden Sie zwei hierarchische foreach-Schleifen (erhöhen die Anzahl der Interaktionen) oder eine foreach-Schleife, um einen inermediate-Typ zu erstellen, und eine zweite, um über die Auflistung der Intermediate zu iterieren oder wenn die Typen in den Sammlungen dieselben sind Liste (mit AddRange) und dann über diese neue Liste iterieren.

Viele Wege führen zu einem Ziel ... es liegt an dir, eins zu wählen.

    
AxelEckenberger 25.01.2013 06:32
quelle
3

Sie können die Sammlungen komprimieren

%Vor%

Dies setzt voraus, dass die Elemente an der gleichen Position übereinstimmen (z. B. tritt das erste Element von collection1 dem ersten Element von collecion2 bei). Es ist ziemlich effizient.

    
Stefan Steinegger 25.01.2013 06:52
quelle
1

Nein, Sie können nicht mehrere Variablen in einer foreach, in-Schleife verwenden. Überprüfen Sie die Sprachreferenz . Was würde passieren, wenn jede Sammlung eine andere Anzahl von Elementen hätte?

Wenn Sie über beide Sammlungen hinweg iterieren möchten, versuchen Sie es mit einer Union:

%Vor%     
ColinE 25.01.2013 06:31
quelle
1

foreach wird zum Aufzählen einzelner Elemente in einer Sammlung verwendet. Also nein, du kannst nicht. Du musst es nacheinander benutzen. Es wäre besser zu verwenden:

%Vor%

als

%Vor%

Dies würde n * m mal laufen. Während das vorherige Beispiel nur n + m mal ausgeführt werden würde.

    
aaa 25.01.2013 06:42
quelle
1

Gemessen an Ihren Kommentaren denke ich, was Sie wirklich versuchen, ist nicht das kartesische Produkt der beiden Sammlungen, sondern ein [SQL] UNION der beiden Mengen. Sie haben zwei Möglichkeiten:

  1. Concat die zwei Sammlungen:

    %Vor%
  2. Fügen Sie sie beide getrennt hinzu, vorausgesetzt, Sie müssen nichts Besonderes durch Iteration machen (wahrscheinlich das Beste / Einfachste):

    %Vor%

Wenn Sie jedoch das kartesische n * m-Produkt von [SQL pseudocode] collection1 CROSS JOIN collection2 verwenden möchten, verwenden Sie zwei verschachtelte foreach-Anweisungen:

%Vor%

Oder Sie können die beiden in LINQ verknüpfen und über die verbundene Sammlung iterieren:

%Vor%     
lc. 25.01.2013 06:32
quelle
0

Möchten Sie die Elemente aus einer Sammlung mit den entsprechenden Elementen der anderen verknüpfen?

%Vor%

Hinweis: Wenn die erste Sammlung 10 Elemente enthält und die zweite 8, erhalten Sie 8 Paare; Die letzten beiden Elemente in der ersten Sammlung werden gelöscht, da sie in der zweiten Sammlung nicht übereinstimmen. Im Allgemeinen ist die Anzahl der Iterationen Min(col1.Count(), col2.Count()) .

Möchten Sie alle Elemente in einer Sammlung und dann alle Elemente in der zweiten Ebene iterieren?

%Vor%

Hinweis: Wenn die erste Sammlung 10 Elemente hat und die zweite 8, wird diese Schleife 18 mal ausgeführt, oder, allgemeiner, die Anzahl der Iterationen ist col1.Count() + col2.Count() .

Möchten Sie jedes Element in einer Sammlung mit jedem Element in dem anderen Paar verbinden?

%Vor%

Hinweis: Dies ist das kartesische Produkt. Daher ist es nicht überraschend, dass die Anzahl der Iterationen das Produkt der Größen der Kollektionen ist. Wenn wir 10 und 8 Elemente haben, wird die Schleife 80 mal ausgeführt. Der Konsistenz halber ist das col1.Count() * col2.Count() .

    
phoog 25.01.2013 07:28
quelle
0

Sie könnten einen Iterator verwenden:

%Vor%     
M Mckay-Davies 06.08.2015 15:48
quelle

Tags und Links