マスターPerson
レコードと 1 つ (または複数) の複製Persons
があり、それらのデータをマージして、複製よりもマスターを優先します。
電話番号に関して言えば、目標はデータをマージすることです。単一の電話番号をPhone
フィールドに入力し、他の電話番号をメモ フィールドに入力します (それらを完全に破棄しないようにするため)。レコードには、電話番号が含まれる場合と含まれない場合があります。
簡潔にするために、基本的に同じ数字の束をメモ フィールドに追加したくありません。したがって、フィールドに次のものが含まれないようにします。
(1234) 123123
1234 123123
フォーマットとスペースを破棄できれば簡単ですが、それらを保持する必要があります (先頭/末尾の空白を除く)。
構造体を作成することから始めました (構造体とクラスがある理由はわかりませんが、とにかく)
Friend Structure PhoneNumber
Private _Raw As String
Public Property Raw() As String
Get
Return _Raw
End Get
Set(ByVal value As String)
_Raw = value
End Set
End Property
Private _Stripped As String
Public Property Stripped() As String
Get
Return _Stripped
End Get
Set(ByVal value As String)
_Stripped = value
End Set
End Property
Sub New(ByVal num As String)
Raw = num
Dim RegexObj As New System.Text.RegularExpressions.Regex("[^\d]")
Stripped = RegexObj.Replace(num, "")
MsgBox(num & vbCrLf & Stripped)
End Sub
End Structure
次に、マージ コードは次のようになります。
Dim phones As New List(Of PhoneNumber)
If master.Phone.Trim.Length > 1 Then
phones.Add(New PhoneNumber(master.Phone.Trim))
End If
For Each x As Person In duplicates
If x.Phone.Trim.Length > 1 And Not phones.Contains(New PhoneNumber(x.Phone.Trim)) Then
phones.Add(New PhoneNumber(x.Phone.Trim))
End If
Next
If phones.Count > 0 Then
master.Phone = phones(0).Raw
End If
For i = 1 To phones.Count - 1
master.Notes &= vbCrLf & "Alt. Phone: " & phones(i).Raw
Next
しかし、明らかに、ここでの問題は重複を許可していることです。
を「取り除かれた」値のみに一致させたいのですContains
が、もちろん、それを行うことを知りません。
これは、そのようなマイナーな機能にはすでに多すぎるコードのように思えますが、現時点では、Contains
削除されたもののみに一致する and を置き換える何か (構造内に?) を作成することを検討しています。もっときちんとした方法はありますか?
コードは VB ですが、C# は大歓迎です。
マスターを優先する必要があることも忘れないでください。したがって、LINQ と Distinct を使用する場合は、並べ替え順序が失われないようにする必要があります (これは私の理解です)。