2014-06-19 86 views
0

以下代碼將CSV文件讀取到DataTable中。然後循環通在數據表中的所有列,並嘗試使用LINQ查詢生成所有不同值的每列數:爲什麼我的Linq GroupBy查詢不返回正確的計數值?

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

爲什麼「grp.Count()」值永遠不會大於1,即使我知道所有列都包含重複值?

 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

DataRowEqualsGetHashCode方法並不基於各行的值,但對對象的引用。兩列具有相同列值的行不相等。您需要創建一個自定義IEqualityComparer來根據每列的值來比較行。

在這種特殊情況下,一個合適的實現已經寫在DataRowComparer類的形式,因此基於該行,而不是參考值分組到組時,你可以使用DataRowComparer.Default作爲IEqualityComparer行。

+0

謝謝Servy。這解決了我的問題。我修改了這行:var g = allValues.AsEnumerable()。GroupBy(i => i); var g = allValues.AsEnumerable()。GroupBy(i => i,DataRowComparer.Default); – xpanzive

相關問題