投稿者 YUU  (社会人) 投稿日時 2015/12/8 18:07:49

現在OracleとSqlserverから取得したDataTableを比較するプログラムを作成しております。

Oracleデータ ⇒ DataTable1
Sqlserverデータ ⇒ DataTable2

このご時世Entity Frameworkをなぜ使わぬといった話ですが今回はDataTableにて比較を行いたいと考えております。

http://qa.atmarkit.co.jp/q/9488

上記サイトを参考にLinq ラムダ式にて一つ一つループで回して比較するすべから逃れられそうなのですが如何せんC#の文法に苦戦しております。

現在最後に回答されている方の方式を.netの文法に置き換えているのですが置き換え方が分からない文法が有ります。(1人目の方はできました。)


Class DataRowComparer
    Implements IEqualityComparer(Of DataRow)

    Public Overloads Function Equals(x As DataRow, y As DataRow) As Boolean Implements IEqualityComparer(Of System.Data.DataRow).Equals
        Return Object.ReferenceEquals(x, y) OrElse (x IsNot Nothing AndAlso y IsNot Nothing AndAlso CompareAllColumns(x, y))
    End Function

    Private Function CompareAllColumns(x As DataRow, y As DataRow) As Boolean

        Dim intColumns As String() = New String() {"ID"}

        Return New String() {"ID", "Name"}.Select(Function(name) New With {.Name = name,
                                                                           .X = x(name),
                                                                           .Y = y(name),
                                                                           .IsInt = intColumns.Contains(name)}).Aggregate(True, Function(acc, succ)
                                                                                                                                    '下記のコメントアウト部分です。
                                                                                                                                    'if (DBNull.Value.Equals(succ.X) || DBNull.Value.Equals(succ.Y)) return acc && (succ.X?.Equals(succ.Y) ?? false);
                                                                                                                                    
    If succ.IsInt Then
                                                                                                                                        Return acc AndAlso (CInt(succ.X) = CInt(succ.Y))
                                                                                                                                    End If

                                                                                                                                    Return acc AndAlso (succ.X Is succ.Y)

                                                                                                                                End Function)

    End Function

    Public Overloads Function GetHashCode(obj As DataRow) As Integer Implements IEqualityComparer(Of System.Data.DataRow).GetHashCode

        If obj Is Nothing Then
            Return 0
        End If

        Dim idHashCode As Integer = If(obj("ID") Is Nothing, 0, obj("ID").GetHashCode())
        Dim nameHashCode As Integer = If(obj("Name") Is Nothing, 0, obj("Name").GetHashCode())

        Return idHashCode Xor nameHashCode

    End Function

End Class

上記のコメントアウト部分以外は.net文法に直せたかと思うのですがコメントの部分のみうまく変換できません。(それら以外は多分できたのかな?)

お力を貸していただけると幸いです。