1

マスター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 を使用する場合は、並べ替え順序が失われないようにする必要があります (これは私の理解です)。

4

1 に答える 1

1

これを行うためのより良い方法は、Dictionary. そうすれば、構造体を使用せずに、キー (削除された電話番号) と値 (フォーマットされたオリジナル) の両方で辞書検索を使用できます。

このようなもの:

    Dim RegexObj As New System.Text.RegularExpressions.Regex("[^\d]")
    Dim phones As New Dictionary(Of String, String)
    master.Phone = master.Phone.Trim
    If master.Phone.Length > 1 Then
        phones.Add(RegexObj.Replace(master.Phone, ""), master.Phone)
    End If
    For Each x As Person In duplicates
        x.Phone = x.Phone.Trim
        If x.Phone.Length > 1 And Not phones.ContainsKey(RegexObj.Replace(x.Phone, "")) Then
            phones.Add(RegexObj.Replace(x.Phone, ""), x.Phone)
        End If
    Next
    If phones.Count > 0 Then
        master.Phone = phones.First.Value
        phones.Remove(phones.First.Key)
    End If
    For Each entry As KeyValuePair(Of String, String) In phones
        master.Notes &= IIf(String.IsNullOrEmpty(master.Notes.Trim), "", vbCrLf).ToString _
            & "Alt. Phone: " & entry.Value
    Next
于 2012-02-13T10:00:30.570 に答える