2016-07-27 3 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

첫 번째 열의 값이 두 개 이상의 행에 대해 동일한 때 중복 기록을 얻을 수 있다고 가정 : 여기 내 코드의

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(); 
: 여기

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

하는 예입니다

+0

이것은 단일 데이터 테이블에서 중복 행을 반환하지만 중복 행을 표시하는 두 데이터 테이블간에 공통 행을 가져 오려고합니다. 예 : 첫 번째 데이터 테이블에 두 개의 동일한 행 A와 B가 있으면 교차에서 두 행을 모두 표시해야합니다. –

+0

다음과 같이하십시오 : 테이블의 ID를 비교해야한다고 가정합니다. table1.Field ("ID")는 Convert.ToInt32와 같습니다 (table2.Field ("ID")) – Lakhtey

관련 문제