Partager via


Comparaison de DataRows (LINQ to DataSet)

Language-Integrated Query (LINQ) définit différents opérateurs set pour comparer les éléments sources pour voir s’ils sont égaux. LINQ fournit les opérateurs d’ensembles suivants :

Ces 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érences, ce qui n’est généralement pas le comportement idéal pour définir des opérations sur des données tabulaires. Pour les opérations set, vous souhaitez généralement déterminer si les valeurs d’élément sont égales et non les références d’élément. Par conséquent, la DataRowComparer classe a été ajoutée à LINQ to DataSet. Cette classe peut être utilisée pour comparer les valeurs de ligne.

La DataRowComparer classe contient une implémentation de comparaison de valeurs pour DataRow, de sorte que cette classe peut être utilisée pour les opérations définies telles que Distinct. Cette classe ne peut pas être instanciée directement ; à la place, la Default propriété doit être utilisée pour retourner une instance du DataRowComparer<TRow>. La Equals méthode est ensuite appelée et les deux DataRow objets à comparer sont passés en tant que paramètres d’entrée. La Equals méthode retourne true si l’ensemble ordonné de valeurs de colonne dans les deux DataRow objets est égal ; sinon, false.

Exemple :

Cet exemple utilise Intersect pour renvoyer les contacts présents dans les deux tables.

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable contactTable = ds.Tables["Contact"];

// Create two tables.
IEnumerable<DataRow> query1 = from contact in contactTable.AsEnumerable()
                              where contact.Field<string>("Title") == "Ms."
                              select contact;

IEnumerable<DataRow> query2 = from contact in contactTable.AsEnumerable()
                              where contact.Field<string>("FirstName") == "Sandra"
                              select contact;

DataTable contacts1 = query1.CopyToDataTable();
DataTable contacts2 = query2.CopyToDataTable();

// Find the intersection of the two tables.
var contacts = contacts1.AsEnumerable().Intersect(contacts2.AsEnumerable(),
                                                    DataRowComparer.Default);

Console.WriteLine("Intersection of contacts tables");
foreach (DataRow row in contacts)
{
    Console.WriteLine($"Id: {row["ContactID"]} {row["Title"]} {row["FirstName"]} {row["LastName"]}");
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim contactTable As DataTable = ds.Tables("Contact")

Dim query1 = _
    From contact In contactTable.AsEnumerable() _
    Where contact.Field(Of String)("Title") = "Ms." _
    Select contact

Dim query2 = _
    From contact In contactTable.AsEnumerable() _
    Where contact.Field(Of String)("FirstName") = "Sandra" _
    Select contact

Dim contacts1 = query1.CopyToDataTable()
Dim contacts2 = query2.CopyToDataTable()

Dim contacts = contacts1.AsEnumerable() _
    .Intersect(contacts2.AsEnumerable(), DataRowComparer.Default)

Console.WriteLine("Intersect of employees tables")

For Each row In contacts
    Console.WriteLine("Id: {0} {1} {2} {3}", _
            row("ContactID"), row("Title"), row("FirstName"), row("LastName"))
Next

Exemple :

L’exemple suivant compare deux lignes et obtient leurs codes de hachage.

' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

' Get two rows from the SalesOrderHeader table.
Dim table As DataTable = ds.Tables("SalesOrderHeader")
Dim left = table.Rows(0)
Dim right = table.Rows(1)

' Compare the two different rows.
Dim comparer As IEqualityComparer(Of DataRow) = DataRowComparer.Default
Dim bEqual = comparer.Equals(left, right)

If (bEqual = True) Then
    Console.WriteLine("Two rows are equal")
Else
    Console.WriteLine("Two rows are not equal")
End If

' Output the hash codes of the two rows.
Console.WriteLine("The hashcodes for the two rows are {0}, {1}", _
    comparer.GetHashCode(left), _
    comparer.GetHashCode(right))

Voir aussi