2016-07-27 39 views
0

我想從兩個數據表中獲取公共行。但是在這兩者上的交集操作消除了重複的行(在同一個數據表中重複)並且只返回唯一的行。作爲枚舉交集的結果保留重複行

如何在結果中保留重複行?這裏是我的代碼:

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個相同的行A和B,則Intersection應顯示兩行。 –

+0

嘗試像下面這樣做:讓我們說你必須比較表的ID:table1.Field (「ID」)等於Convert.ToInt32(table2.Field (「ID」)) – Lakhtey