Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Language-Integrated Query (LINQ) definisce vari operatori set per confrontare gli elementi di origine per verificare se sono uguali. LINQ fornisce i seguenti operatori di insieme:
Questi operatori confrontano gli elementi di origine chiamando i metodi GetHashCode e Equals su ciascuna raccolta di elementi. Nel caso di , DataRowquesti operatori eseguono un confronto di riferimento, che in genere non è il comportamento ideale per le operazioni di impostazione sui dati tabulari. Per le operazioni set, in genere si vuole determinare se i valori degli elementi sono uguali e non i riferimenti agli elementi. Di conseguenza, la DataRowComparer classe è stata aggiunta a LINQ to DataSet. Questa classe può essere usata per confrontare i valori di riga.
La DataRowComparer classe contiene un'implementazione di confronto dei valori per DataRow, quindi questa classe può essere usata per le operazioni set, Distinctad esempio . Non è possibile creare direttamente un'istanza di questa classe; invece, è necessario utilizzare la proprietà Default per restituire un'istanza di DataRowComparer<TRow>. Il Equals metodo viene quindi chiamato e i due DataRow oggetti da confrontare vengono passati come parametri di input. Il Equals metodo restituisce true se il set ordinato di valori di colonna in entrambi DataRow gli oggetti è uguale; in caso contrario, false.
Esempio
In questo esempio viene utilizzato Intersect per restituire i contatti che appaiono in entrambe le tabelle.
// 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
Esempio
Nell'esempio seguente vengono confrontate due righe e vengono restituiti i relativi codici 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))