次の方法で共有


DataRow の比較 (LINQ to DataSet)

Language-Integrated クエリ (LINQ) では、ソース要素を比較して等しいかどうかを確認するためのさまざまなセット演算子が定義されています。 LINQ には、次のセット演算子が用意されています。

これらの演算子は、要素の各コレクションで GetHashCode メソッドと Equals メソッドを呼び出すことによって、ソース要素を比較します。 DataRowの場合、これらの演算子は参照比較を実行します。これは、通常、表形式データに対する設定操作に最適な動作ではありません。 セット操作では、通常、要素の値が要素参照ではなく等しいかどうかを判断します。 そのため、 DataRowComparer クラスが LINQ to DataSet に追加されました。 このクラスを使用して、行の値を比較できます。

DataRowComparer クラスには、DataRowの値比較実装が含まれているため、このクラスは、Distinctなどの設定操作に使用できます。 このクラスを直接インスタンス化することはできません。代わりに、 Default プロパティを使用して、 DataRowComparer<TRow>のインスタンスを返す必要があります。 その後、 Equals メソッドが呼び出され、比較する 2 つの 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: {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

次の例では、2 つの行を比較し、ハッシュ コードを取得します。

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

こちらも参照ください