Compartir a través de


Comparar filas de datos (LINQ a DataSet)

Language-Integrated Query (LINQ) define varios operadores de conjunto para comparar los elementos de origen para ver si son iguales. LINQ proporciona los siguientes operadores de conjunto:

Estos operadores comparan los elementos de origen llamando a los métodos GetHashCode y Equals en cada colección de elementos. En el caso de , DataRowestos operadores realizan una comparación de referencia, que generalmente no es el comportamiento ideal para establecer operaciones en datos tabulares. Para las operaciones de conjuntos, por lo general deseará determinar si los valores del elemento son iguales o no a las referencias del elemento. Por lo tanto, la DataRowComparer clase se ha agregado a LINQ to DataSet. Esta clase se puede usar para comparar valores de fila.

La DataRowComparer clase contiene una implementación de comparación de valores para DataRow, por lo que esta clase se puede usar para establecer operaciones como Distinct. No se puede crear una instancia directa de esta clase; en su lugar, la Default propiedad debe usarse para devolver una instancia de .DataRowComparer<TRow> A continuación, se llama al método Equals, y luego, los dos objetos DataRow que se van a comparar se pasan como parámetros de entrada. El Equals método devuelve true si el conjunto ordenado de valores de columna de ambos DataRow objetos es igual; en caso contrario, false.

Ejemplo

En este ejemplo se usa Intersect para devolver contactos que aparecen en ambas tablas.

// 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

Ejemplo

En el ejemplo siguiente se comparan dos filas y se obtienen sus códigos hash.

' 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))

Consulte también