2016-07-27 3 views
0

2つのデータテーブルから共通の行を取得しようとしています。しかし、これらの2つの上の交差演算は、重複行(同じデータ表内の重複)を排除し、一意の行のみを戻します。列挙可能な交差の結果として重複する行を保持する

結果に重複行を保持するにはどうすればよいですか?ここに私のコードは次のとおりです。

最初の列の値が2つの以上の行で同一であるときに、重複するレコードを取得すると仮定すると
class Program 
{ 
    public static void Main(string[] args) 
    { 
     var a=ImportExcelToDataTable(@"D:\Dummy\Test\CD24.xlsx"); 
     var b = ImportExcelToDataTable(@"D:\Dummy\Test\CD25.xlsx"); 

     CustomDataRowComparer myDRComparer = new CustomDataRowComparer(); 
     try 
     { 
      var comonData = a.AsEnumerable().Intersect(b.AsEnumerable(), myDRComparer).CopyToDataTable(); 

        } 

     catch (Exception ex) 
     { 
      ex.ToString(); 
     } 

    } 

} 

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

     for (int i = 0; i < 6; i++) 
     { 
      if (i == 4) 
      { 
       //ignore 
      } 
      else 
      { 
       if (x[i].ToString() != y[i].ToString()) 
       { 
        return false; 
       } 
      } 
     } 
     return true; 
    } 

    public int GetHashCode(DataRow obj) 
    { 

     return string.Join("^", obj.ItemArray.Select((x, i) => (i == 4) || (i > 6) ? "" : x.ToString()).ToArray()).GetHashCode(); 

    } 
} 

答えて

0

var duplicates = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1); 
ここ

は一例です:

DataTable dt = new DataTable(); 
dt.Columns.Add(); 
dt.Columns.Add(); 
dt.Columns.Add(); 
dt.Rows.Add(1, "Test1", "Sample1"); 
dt.Rows.Add(2, "Test2", "Sample2"); 
dt.Rows.Add(3, "Test3", "Sample3"); 
dt.Rows.Add(4, "Test4", "Sample4"); 
dt.Rows.Add(5, "Test5", "Sample5"); 

var duplicates = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1).ToList(); 
Console.WriteLine("Duplicate found: {0}", duplicates.Any()); 

dt.Rows.Add(1, "Test6", "Sample6"); // Duplicate on 1 
dt.Rows.Add(1, "Test6", "Sample6"); // Duplicate on 1 
dt.Rows.Add(3, "Test6", "Sample6"); // Duplicate on 3 
dt.Rows.Add(5, "Test6", "Sample6"); // Duplicate on 5 

duplicates = dt.AsEnumerable().GroupBy(r => r[0]).Where(gr => gr.Count() > 1).ToList(); 
if (duplicates.Any()) 
    Console.WriteLine("Duplicate found for Classes: {0}", String.Join(", ", duplicates.Select(dupl => dupl.Key))); 

Console.ReadLine(); 
+0

これは、単一のデータテーブルから重複した行を返しますが、重複する行を表示する2つのデータテーブル間の共通の行を取得したいとします。例えば。最初のデータテーブルに2つの同一の行AとBがある場合、交差で両方の行が表示されます。 –

+0

次のようにしてみましょう:テーブルのIDを比較する必要があるとしましょう:table1.Field ( "ID")はConvert.ToInt32(table2.Field ( "ID")と等価) – Lakhtey

関連する問題