1

我们有一个主Person记录和一个(或多个)副本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仅在剥离时替换和匹配。有没有更简洁的方法?

代码在 VB 中,但欢迎使用 C# 回答。

还要记住,我们必须优先考虑master,所以如果我们使用 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 回答