2014-06-19 3 views
0

다음 코드는 CSV 파일을 DataTable로 읽습니다. 그런 다음 DataTable의 모든 열을 통해 루프 및 LINQ 쿼리 사용하여 각 열의 모든 고유 값의 수를 생성하려고 :보다 결코 더Linq GroupBy 쿼리가 올바른 카운트 값을 반환하지 않는 이유는 무엇입니까?

var g = allValues.AsEnumerable().GroupBy(i => i); 

은 왜이다 "grp.Count()"값을 1 모든 열에 중복 값이 ​​포함되어 있음을 알고 있더라도? DataRow

 private void button13_Click(object sender, System.EventArgs e) 
    { 
     DataSet ds = GetDataFromCSVFile(-1); 

     DataTable table = ds.Tables[0]; 

     int test = 0; 
     string[] columnToSearch = { "" }; 

     IList<ColumnDetail> colDetails = new List<ColumnDetail>(); 

     foreach (DataColumn col in table.Columns) 
     { 
      columnToSearch[0] = col.ToString(); 

      DataTable allValues = GetAllValuesFromColumn(table, columnToSearch); 

      var g = allValues.AsEnumerable().GroupBy(i => i); 

      test = 0; 
      foreach (var grp in g) 
      { 
       if (grp.Count() > 1) 
        MessageBox.Show(" grp.Key.ItemArray[0].ToString() : " + grp.Key.ItemArray[0].ToString() + " Cnt: " + grp.Count()); 
       test++; 
      } 
      MessageBox.Show("Count is: " + test); 
     } 
    } 

답변

0

EqualsGetHashCode 및 방법은 각 행의 값을 기반으로하지만, 오브젝트의 기준에 아니다. 동일한 열 값을 갖는 두 개의 행은 동일하지 않습니다. 대신 각 열의 값에 따라 행을 비교하려면 사용자 정의 IEqualityComparer을 작성해야합니다. 이 특별한 경우

는 적절한 구현은 이미 DataRowComparer 클래스의 형태로 기록 된, 그래서 대신에 대한 참조의 행의 값에 따라 그룹으로 그룹화 할 때 당신은 단지 IEqualityComparerDataRowComparer.Default을 사용할 수 있습니다 행.

+0

감사합니다. 그게 내 문제를 해결해 줬어. 줄을 수정했습니다 : var g = allValues.AsEnumerable(). GroupBy (i => i); var g = allValues.AsEnumerable(). GroupBy (i => i, DataRowComparer.Default); – xpanzive

관련 문제