我们有一个主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,我们需要确保我们不会丢失排序顺序(这是我的理解)。