2012-05-29 10 views
3

프로그래밍에 익숙하지 않아 다소 간단 해 보일 수도 있지만 알아낼 수는 없습니다.중복 항목 찾기 C#

값의 한 열에서 데이터 테이블에있는 중복 값을 찾으려고합니다.

여기 내가 그걸 해보려고했다.

DataRow[] dupresults = dt.Select("PROV_NEW"); 
TableIssues = string.Empty; 
DataTable dtTemp = dt.DefaultView.ToTable(true, "NEW_PROV"); 

if (dupresults.Length == 0) 
{ 
    return true; 
} 
else 
{ 
    foreach (DataRow item in dupresults) 
    { 
     Console.WriteLine(item[1]); 
     TableIssues += "Provider Code is not unique for " + item[1].ToString() + ". Revise non-unique codes.\r\n\n\n\n"; 
    } 
    return false; 
} 

좋아요. 그렇지만 PROV_NEW에도 빈 필드가 없도록 검색하고 있습니다. 그래서 나는 어디에 넣어야할지 모른다. 나는 C#에 매우 익숙하다. 나는 지난 주에 막 시작했다. 나는 아버지 회사의 부업 프로젝트를하고있다.

private bool ValidateTable(DataSets.Setup.SETUP_MWPROVDataTable dt, out string TableIssues) 
    { 
     try 
     { 
      //NewCode not used for other row 
      DataRow[] result = dt.Select("PROV_NEW = ''"); 
      DataRow[] dupresults = dt.Select("PROV_NEW"); 
      TableIssues = string.Empty; 
      DataTable dtTemp = dt.DefaultView.ToTable(true, "NEW_PROV"); 



      if (dupresults.Length == 0) 
      { 

       return true; 
      } 
      else 
      { 
       var duplicates = dt.AsEnumerable() 
       .Select(dr => dr.Field<string>("PROV_NEW")) 
       .GroupBy(x => x) 
       .Where(g => g.Count() > 1) 
       .Select(g => g.Key) 
       .ToList(); 

       foreach (DataRow item in dupresults) 
       { 
        Console.WriteLine(item[1]); 
        TableIssues += "Provider Code is not unique for " + item[1].ToString() + ". Revise non-unique codes.\r\n\n\n\n"; 
       } 
       return false; 
      } 


      if (result.Length == 0) 
      { 
       //TODO: Add Next Step for validation 

       return true; 

      } 
      else 
      { 
       foreach (DataRow item in result) 
       { 
        Console.WriteLine(item[1]); 
        TableIssues += "Provider code " + item[1].ToString() + " is blank. Add new Provider code for " + item[1].ToString() +".\r\n\n\n"; 
       } 


       return false; 
      } 

      } 
     catch (Exception) 
     { 

      throw; 
     } 
    } 


} 
+2

루프에서 문자열을 연결하지 마십시오. 'StringBuilder'를 사용하십시오. 어쩌면 첫 번째 프로젝트에서는 중요하지 않을 수도 있지만 좋은 습관이 있습니다. –

+0

무엇이 작동하지 않습니까? 오류가 있습니까? – FishBasketGordo

+0

"필터 식 'PROV_NEW'이 부울 용어로 평가되지 않습니다."라는 오류가 계속 나타납니다. 그래서 나는 거기에서 무슨 일이 일어나고 있는지 정말로 모른다. – Kobrien

답변

13

LINQ는 여기에 당신을 도울 수 있습니다 : 또는

var duplicates = dt.AsEnumerable() 
        .Select(dr => dr.Field<string>("PROV_NEW")) 
        .GroupBy(x => x) 
        .Where(g => g.Count() > 1) 
        .Select(g => g.Key) 
        .ToList(); 

// Now work with the set of duplicates 

:

HashSet<string> providers = new HashSet<string>(); 
foreach (var provider in dt.AsEnumerable() 
          .Select(dr => dr.Field<string>("PROV_NEW"))) 
{ 
    if (!providers.Add(provider)) 
    { 
     // This provider is a duplicate 
    } 
} 

(이 작동하기 때문에 HashSet<T>.Add 반환 값이 이미 설정에 존재하는 경우는 false.)

+0

항상 그렇듯이, LINQ의 마스터. –

+0

대신 비교할 복합 키가있는 경우 HashSet 구현은 무엇입니까? 귀하의 예제는 "PROV_NEW"키 하나만 보여줍니다 –

+0

@ LetsKickSomeAssin.net : 아마도 익명 형식을 사용할 것입니다. 익명 형식은 이미 각 구성 요소에 대한 기본 동일성 비교를 사용하여 적절하게 평등을 구현합니다. –

0

dtEmp은 작업 데이터 테이블입니다.

DataTable distinctTable = dtEmp.DefaultView.ToTable(/*distinct*/ true); 
1

다중 열 선택에 익명 형 LINQ를 사용하여 Jon Skeet's 조언을 촬영, 나 자신에게 솔루션을 가지고, 너무 당신을 도움이되기를 바랍니다 :

DataTable dt_ = _data.Tables["MyTable"]; 

     foreach (DataRow _dr in dt_.AsEnumerable() 
     .GroupBy(r => new 
     { 
      c1 = r.Field<string>("ColNAME1 of table dt_"), 
      c2 = r.Field<string>("ColNAME2 of table dt_"), 
      c3 = r.Field<string>("ColNAME3 of table dt_"), 
    ...<any number of columns can be added> 
     }).Where(grp => grp.Count() > 1).SelectMany(itm => itm)) 
     { 
     // Handle your Duplicate row entry 
     }