Dela via


Jämföra DataRows (LINQ med DataSet)

Språkintegrerad fråga (LINQ) definierar olika uppsättningsoperatorer för att jämföra källelement för att se om de är lika. LINQ tillhandahåller följande uppsättningsoperatorer:

Dessa operatorer jämför källelement genom att anropa GetHashCode metoderna och Equals för varje samling element. När det gäller en DataRowutför dessa operatorer en referensjämförelse, vilket vanligtvis inte är det idealiska beteendet för att ange åtgärder över tabelldata. För uppsättningsåtgärder vill du vanligtvis avgöra om elementvärdena är lika och inte elementreferenserna. Därför DataRowComparer har klassen lagts till i LINQ i DataSet. Den här klassen kan användas för att jämföra radvärden.

Klassen DataRowComparer innehåller en värdejämförelseimplementering för DataRow, så att den här klassen kan användas för uppsättningsåtgärder som Distinct. Den här klassen kan inte instansieras direkt. i stället måste egenskapen Default användas för att returnera en instans av DataRowComparer<TRow>. Metoden Equals anropas sedan och de två DataRow objekt som ska jämföras skickas som indataparametrar. Metoden Equals returnerar true om den ordnade uppsättningen med kolumnvärden i båda DataRow objekten är lika. Annars false.

Exempel

I det här exemplet används Intersect för att returnera kontakter som visas i båda tabellerna.

// 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: {0} {1} {2} {3}",
        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

Exempel

I följande exempel jämförs två rader och deras hashkoder.

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

Se även