比较 DataRow (LINQ to DataSet)

语言集成查询 (LINQ) 定义多种用于比较源元素的集合运算符以查看它们是否相等。 LINQ 提供下面的集合运算符:

这些运算符通过对每个元素集合调用 GetHashCodeEquals 方法来比较源元素。 对于 DataRow,这些运算符执行引用比较,在对表格格式数据执行集合操作的情况下,这通常不是理想的行为。 对于集合运算,通常需要确定元素值而不是元素引用是否相等。 因此,向 LINQ to DataSet 中添加了 DataRowComparer 类。 此类可用于比较行值。

DataRowComparer 类包含 DataRow 的值比较实现,所以此类可用于设置集合操作,例如 Distinct。 此类不能直接实例化,而必须使用 Default 属性返回 DataRowComparer 的实例。 然后调用 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))

请参见

参考

DataRowComparer

概念

向数据集中加载数据

其他资源

LINQ to DataSet 示例