比較 DataRow (LINQ to DataSet)
Language-Integrated Query (LINQ) 定義各種設定運算子,可比較來源元素以便查看它們是否相等。 LINQ 會提供下列設定運算子:
這些運算子會針對每個項目集合呼叫 GetHashCode 和 Equals 方法,藉以比較來源項目。 在 DataRow 的情況中,這些運算子會執行參考比較,但是這通常不是表格式資料之設定作業的理想行為。 若為設定作業,您通常會想要判斷項目值是否相等,而非項目參考。 因此,DataRowComparer 類別已新增至 LINQ to DataSet。 這個類別可用來比較資料列值。
DataRowComparer 類別包含 DataRow 的值比較實作 (Implementation),所以這個類別可用於 Distinct 等設定作業。 您無法直接具現化 (Instantiated) 這個類別,而必須使用 Default 屬性來傳回 DataRowComparer<TRow> 的執行個體 (Instance)。 然後,系統會呼叫 Equals 方法並將要比較的兩個 DataRow 物件當做輸入參數傳入。 如果這兩個 Equals 物件中的已排序資料行值組相等,true
方法就會傳回 DataRow,否則它會傳回 false
。
範例
這則範例會使用 Intersect
來傳回在這兩份資料表中都出現的連絡人。
// 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
範例
下列範例會比較兩個資料列並取得其雜湊程式碼。
' 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))