2014-06-19 39 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

相关问题