2016-07-21 3 views
0

45000を超える行を持つ2つのデータテーブルの間に共通の行(重複行を含む)をすべて取得したいとします。2つのデータテーブルの交差点がカスタムデータコンシューマでゼロ行を返します

しかし、私は比較範囲から "列2"と "列6の後のすべての列"をスキップしたいと思います。しかし、私は交差結果として行を取得していません。私はどこに間違っているのかを誰にでも示唆することができますか?ここで

は私のコードが書かれたのです。ここで

CustomDataRowComparer myDRComparer = new CustomDataRowComparer(); 
var commonData = outputTable.AsEnumerable().Intersect(prevTable.AsEnumerable(), myDRComparer).CopyToDataTable(); 



    public class CustomDataRowComparer : IEqualityComparer<DataRow> 
    { 
     public bool Equals(DataRow x, DataRow y) 
     { 
      for (int i = 0; i < 7; i++) 
      { 


       if (i !=1) // Don't want to consider this column for comparison 
       { 
        if (x[i].ToString() != y[i].ToString()) 
        { 
         return false; 
        } 
       } 

      } 
      return true; 
     } 

     public int GetHashCode(DataRow obj) 
     { 
      return obj.ToString().GetHashCode(); 
     } 
+0

です。これを試してみてください:戻り値string.Join( "^"、obj.ItemArray.Select((x、i)=> i == 1? "":x.ToString())。ToArray())GetHashCode(); – jdweng

+0

ハッシュを使用すると、Equals()メソッドはDataRow xとDataRow yを単に比較できます。ハッシュは一意になり、一致する行が決まります。 – jdweng

答えて

1

は完全なコードは、私は、ハッシュが間違っていると思う

public class CustomDataRowComparer : IEqualityComparer<DataRow> 
    { 
     public bool Equals(DataRow x, DataRow y) 
     { 
      return x.Equals(y); 
     } 

     public int GetHashCode(DataRow obj) 
     { 
      return string.Join("^", obj.ItemArray.Select((x, i) => i == 1 ? "" : x.ToString()).ToArray()).GetHashCode(); 
     } 
    } 
+0

さらに2つの列を除外するためにラムダ式を適合させるにはどうすればよいですか?今、あなたはi = 1を除いています。私はそれをi> = 7を除外するように適応させることができますか? –

+0

私はデータテーブルを調整して、私が比較のために考えたいと思っていた6桁のカラムを持ち、return文を 'return string.Join( "^"、obj.ItemArray.Select((x、i) => i> 5? ":x.ToString())。ToArray())。GetHashCode(); 'しかし、それはまだ動作していません。 –

+0

比較する行が戻ってきていますか?同じデータテーブルをそれ自身と比較して、コードが機能するかどうか確認してください。すべての行が返されます。 – jdweng