2010-10-19 6 views
1

Recherche de lignes uniques dans une table de données à l'aide de la méthode d'extension Distinct(). Certaines lignes contiennent exactement les mêmes données, mais pour une raison quelconque, le code de hachage de ces lignes est différent.Appel de Distinct() sur la collection DataRow

J'ai écrit une classe de comparaison mettant en œuvre IEqualityComparer<DataRow>, cependant, je pense que ce que je fais dans GetHashCode() est ringard et méchant.

La raison pour laquelle je l'ai fait de cette façon parce que Equals() ne sera jamais appelé à moins que les hashcodes sont les mêmes (comportement attendu)

class RowValidationComparer : IEqualityComparer<DataRow> 
     { 
      public bool Equals(DataRow x, DataRow y) 
      { 
       return x.Field<string>("MyField").Equals(y.Field<string>("MyField")); 
      } 

      public int GetHashCode(DataRow obj) 
      { 
       typeof(DataRow).GetHashCode(); 
      } 
     } 

Répondre

3

Recherche de lignes uniques dans une table de données à l'aide de la méthode d'extension Distinct().

Pour ce faire, vous pouvez utiliser la classe DataRowComparer:

var distinct = dataTable.AsEnumerable().Distinct(DataRowComparer.Default); 

Pour une explication générale de MSDN, discuter de l'utilisation des opérateurs fixes, par exemple Distinct sur DataRows:

Ces les opérateurs comparent les éléments sources en appelant les méthodes GetHashCode et Equals sur chaque collection d'éléments. Dans le cas d'un DataRow, ces opérateurs effectuent une comparaison de référence, ce qui n'est généralement pas le comportement idéal pour effectuer des opérations sur des données tabulaires. Pour les opérations d'ensemble, vous voulez généralement déterminer si les valeurs des éléments sont égales et non les références des éléments. Par conséquent, la classe DataRowComparer a été ajoutée à LINQ to DataSet. Cette classe peut être utilisée pour comparer les valeurs des lignes. La classe DataRowComparer contient une implémentation de comparaison de valeurs pour DataRow. Cette classe peut donc être utilisée pour des opérations set telles que Distinct.

+0

datatable Il paie pour vérifier l'API .NET premier –

2

Vous pouvez essayer ...

public int GetHashCode(DataRow obj) { 
    return obj.Field<string>("MyField").GetHashCode(); 
} 

Il devient plus compliqué le plus de champs que vous ajoutez à la valeur du code de hachage. En outre, vous pouvez ajouter des vérifications de référence nulles.

+0

Je pense que obj.Field ("MyField"). GetHashCode() ne vous donnera pas le même hashcode pour chaque datarow dans le – TalentTuner

Questions connexes