2016-06-27 8 views
0

Ich habe so lange geschaut, ich kann nicht sehen, was ich tue. Ich versuche, zwei Datentabellen in C# durchzulaufen und eine Liste von Elementen in table2 zu erstellen, die nicht exakt übereinstimmen oder nicht in table1 enthalten sind. Allerdings bekomme ich immer die vollständige Liste der table2 Artikel. Es ist ein blöder Logikfehler, den ich nicht sehen kann. Kann jemand sehen, was ich hier vermisse?Looping durch DataTables, um Unterschiede zu finden

Vielen Dank.

string results = null; 
foreach (DataRow row1 in table2.Rows) 
{ 
    int x = 0; 
    foreach (DataRow row2 in table1.Rows) 
    { 
     var array1 = row1.ItemArray; 
     var array2 = row2.ItemArray; 
     if (array1.SequenceEqual(array2)) 
     { 
      x = 1; 
      break; // get out of the loop and continue 
     } 
     else 
     { 
      continue; 
     } 
    } 
    if (x == 0) 
    { 
     results = results + (row1["Drug"]); 
    } 
} 
+0

Sollten Sie dies nicht in einer Abfrage tun? Wenn Tabelle 2 nicht die gleiche Anzahl von Zeilen und in der gleichen Reihenfolge wie Tabelle 1 hat, können Sie sie nie auf diese Weise durchlaufen. Auch wenn Ihr Code "IEqualityComparer " implementiert hat, vergleicht SequenceEqual, dass die Referenzen die gleichen sind, nicht nur die Daten. https://msdn.microsoft.com/en-us/library/bb348567(v=vs.100).aspx – jac

+0

Wenn Sie versucht haben, einen Haltepunkt zu platzieren, dann hätten Sie bemerkt, dass das 'x == 0 'immer wahr ist weil 'array1.SequenceEqual (array2)' niemals wahr ist. Auch sollte es keine Ausnahme geben, weil die Ergebnisse null sind und dann fügen Sie '(row1 [" Drug "])' hinzu –

Antwort

0

Ihre Logik funktioniert gut. Hier ist ein Beispiel für eine Dotnet-Geige mit Ihrer Logik: https://dotnetfiddle.net/4KMQ0w.

Ihr Problem muss mit den tatsächlichen Werten in den beiden Tabellen zu tun haben. Zum Beispiel ist klar, dass alle Datentypen in den beiden Tabellen identisch sind, es gibt keine langen vs int oder andere Stringlängen. Andernfalls müssen Sie die "SequenceEqual" in eine Schleife aufteilen und Vergleiche mit jedem Feld manuell durchführen.

Kleinere Kommentare zum Code: 1. Die var array2 = row2.ItemArray; sollte oberhalb der foreach sitzen. 2. Die continue ist zwar nicht schädlich, aber überflüssig. 3. statt int x = 0;bool found = false; oder so verwenden.

Wenn Sie einen effizienteren Gesamtalgorithmus für den Vergleich wünschen, sollten Sie in Erwägung ziehen, table1 in ein Dictionary zu laden und dort eine Suche durchzuführen. Lassen Sie es mich wissen, wenn Sie ein Beispiel dafür benötigen.

Viel Glück.