2016-06-27 10 views
0

私はこれをずっと見てきました。私は何をしているのか分かりません。私はC#で2つのデータテーブルをループし、正確に一致しないかtable1に含まれていないtable2の項目のリストを作成しようとしています。しかし、私はtable2アイテムの完全なリストを取得し続けています。私が見ることができない愚かな論理エラーです。私はここで行方不明を誰も見ることができますか?違いを見つけるためにDataTableをループする

大変ありがとうございます。

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

クエリでこれを行うべきではありませんか?テーブル2の行数が同じでなく、テーブル1と同じ順番になっていない場合は、このように繰り返し実行することはできません。また、あなたのコードが 'IEqualityComparer 'を実装していない限り、SequenceEqualはデータだけでなく参照も同じであると比較します。 https://msdn.microsoft.com/en-us/library/bb348567(v=vs.100).aspx – jac

+0

ブレークポイントを配置しようとすると、 'x == 0'が常に真であることに気づいたでしょう'array1.SequenceEqual(array2)'は決して真ではないからです。また、結果がnullで、 '(row1 [" Drug "])'を追加しているので、 –

答えて

0

ロジックが正常に動作します。あなたのロジックを使用したドットネットのフィーリングの例を以下に示します:https://dotnetfiddle.net/4KMQ0w

問題は、2つのテーブルの実際の値と関係があります。たとえば、2つのテーブル内のすべてのデータ型が同じであることを確認してください。長さはintまたは長さが異なります。もしあなたが "SequenceEqual"をループさせ、各フィールドとの比較を手動で行う必要があります。

コードのマイナーコメント: 1. var array2 = row2.ItemArray;はforeachの上に座る必要があります。 2. continueは害を及ぼすことはありませんが、冗長です。 3. int x = 0;の代わりにbool found = false;などを使用してください。

比較のために全体的なアルゴリズムをより効率的にするには、table1を辞書に読み込んでそこで検索することを検討してください。あなたがこの事例を必要としているかどうか教えてください。

幸運。