共用方式為


比較 DataRow (LINQ to DataSet)

更新: November 2007

Language-Integrated Query (LINQ) 定義了許多設定運算子,可比較來源項目以便查看它們是否相等。LINQ 會提供下列設定運算子:

這些運算子會針對每個項目集合呼叫 GetHashCodeEquals 方法,藉以比較來源項目。在 DataRow 的情況中,這些運算子會執行參考比較,但是這通常不是表格式資料之設定作業的理想行為。若為設定作業,您通常會想要判斷項目值是否相等,而非項目參考。因此,DataRowComparer 類別 (Class) 已經加入至 LINQ to DataSet。這個類別可用來比較資料列值。

DataRowComparer 類別包含 DataRow 的值比較實作 (Implementation),所以這個類別可用於 Distinct 等設定作業。您無法直接具現化 (Instantiated) 這個類別,而必須使用 Default 屬性來傳回 DataRowComparer 的執行個體 (Instance)。然後,系統會呼叫 Equals(DataRow, DataRow) 方法並將要比較的兩個 DataRow 物件當做輸入參數傳入。如果這兩個 DataRow 物件中的已排序資料行值組相等,Equals(DataRow, DataRow) 方法就會傳回 true,否則它會傳回 false。

範例

這則範例會使用 Intersect 來傳回在這兩份資料表中都出現的連絡人。

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

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

請參閱

概念

將資料載入 DataSet

參考

DataRowComparer

其他資源

LINQ to DataSet 範例