2014-06-19 2 views
0

Le code suivant lit un fichier CSV dans un DataTable. Il boucle ensuite à travers toutes les colonnes DataTable et tente de générer un compte de toutes les valeurs distinctes dans chaque colonne en utilisant la requête Linq:Pourquoi ma requête Linq GroupBy ne renvoie-t-elle pas les valeurs de comptage correctes?

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

Pourquoi le « grp.Count() » valeur supérieure à jamais 1 même si je sais que toutes les colonnes contiennent des valeurs en double?

 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); 
     } 
    } 

Répondre

0

Les procédés de DataRowEquals et GetHashCode ne sont pas basées sur les valeurs de chaque ligne, mais sur la référence de l'objet. Deux lignes qui ont les mêmes valeurs de colonne ne sont pas égales. Vous devrez créer un IEqualityComparer personnalisé pour comparer les lignes en fonction des valeurs de chaque colonne.

Dans ce cas particulier, une mise en œuvre appropriée a déjà été écrit sous la forme de la classe DataRowComparer, donc vous pouvez simplement utiliser DataRowComparer.Default comme IEqualityComparer lors du regroupement au groupe en fonction de la valeur des lignes au lieu de la référence à la lignes

+0

Merci Servy. Cela a résolu mon problème. J'ai modifié la ligne: var g = allValues.AsEnumerable(). GroupBy (i => i); à var g = allValues.AsEnumerable(). GroupBy (i => i, DataRowComparer.Default); – xpanzive

Questions connexes