2016-03-18 22 views
0

下面是有問題的代碼的瑕疵。VB.net與字符串比較失敗的問題

Private Const DOB_VALUE As Integer = 0 
Private Const ADDRESS_VALUE As Integer = 1 
Private Const NAME_VALUE As Integer = 2 

For Each oRecord As KeyValuePair(Of Integer, String) In OriginalFileInfo 
     For Each nRecord As KeyValuePair(Of Integer, String) In WorkingFileInfo 
      Dim OriginalComparisonStringSubstrings As String() = oRecord.Value.ToString.ToLower.Split(":") 
      Dim WorkingComparisonStringSubstrings As String() = nRecord.Value.ToString.ToLower.Split(":") 

      ' Are dates of birth the same? 
      If OriginalComparisonStringSubstrings(DOB_VALUE) Like WorkingComparisonStringSubstrings(DOB_VALUE) Then 
       ' Are the address the same? 
       If OriginalComparisonStringSubstrings(ADDRESS_VALUE) Like WorkingComparisonStringSubstrings(ADDRESS_VALUE) Then 
        ' Dob and address are the same, means we have a valid match. Lets check if the names match 
        If OriginalComparisonStringSubstrings(NAME_VALUE) Like WorkingComparisonStringSubstrings(NAME_VALUE) Then 
         ' dob, address and name matches 
        Else 
         ' Dob and address matches, name does not 
        End If 
       End If 
      End If 
     Next 
    Next 

問題是,當我到達地址值比較時,它總是失敗。我的觀察窗口處於活動狀態,數值相同但沒有比較。您可以在下面看到我的Watch窗口輸出。

-  WorkingComparisonStringSubstrings {Length=3} String() 
    (0) "4323" String 
    (1) "123 somewhere lane" String 
    (2) "j ii" String 
-  OriginalComparisonStringSubstrings {Length=3} String() 
    (0) "4323" String 
    (1) "123 somewhere lane" String 
    (2) "j ii j. .johnson" String 
    OriginalComparisonStringSubstrings(DOB_VALUE) Like WorkingComparisonStringSubstrings(DOB_VALUE) True Boolean 
    OriginalComparisonStringSubstrings(ADDRESS_VALUE) Like WorkingComparisonStringSubstrings(ADDRESS_VALUE) False Boolean 
    OriginalComparisonStringSubstrings(NAME_VALUE) Like WorkingComparisonStringSubstrings(NAME_VALUE) False Boolean 

兩個地址,這將是(「123某處車道的」 Like「123某處車道」)應該是真實的比較,而是返回false。我的問題是,爲什麼當這些價值觀如此明顯相等時,這些價值觀相比是失敗的?在我的代碼中,我使用「Like」比較,但我也嘗試了String.Compare,StrComp,.Equals,=和其他每種比較變體。另外,從插入到FileInfo變量到分割和比較時,這些值始終是一個字符串。

任何人都有一個想法,爲什麼他們不會比較?

+0

它看起來像'NAME_VALUE'是什麼失敗(根據您的手錶輸出)。這裏「j ii」不是「Like」(或者等於)「j ii j .johnson」。 – crashmstr

+0

我會檢查地址元素的char數組:Dim a = OriginalComparisonStringSubstrings(1).ToCharArray()'。這些看起來像他們應該基於*你在這裏輸入*(屏幕截圖會很好)。 NAME_VALUE結果是正確的,如果這個匹配足夠接近,可以使用'.StartsWith()' – Plutonix

+0

另外,'Like'用於模式匹配[Like Operator(Visual Basic)](https://msdn.microsoft.com /en-us/library/swf8kaxw.aspx),你似乎沒有這樣做。 – crashmstr

回答

0

我的同事指出的問題。在該程序的以前版本中,我們動態地更改了ADDRESS_VALUE的值。在這個最新版本中,我們將這些值更改爲一個常量整數。

它出現在這個版本中,在我們使ADDRESS_VALUE不變之前,它仍然被分配一個新的值,所以它實際上是比較NAME_VALUE而不是比較ADDRESS_VALUE這實際上會失敗。

謝謝大家的意見。他們真的很有幫助。

0

我還不能評論的基礎上沒有評級,但不應該的dicionary是一個字符串列表? 如:

Dim OriginalFileInfo As New Dictionary(Of Integer, List(Of String)) 

Dim OriginalComparisonStringSubstrings As List(Of String) = oRecord.Value.ToString.ToLower.Split(":") 

的,當您翻翻字典,循環,

If OriginalComparisonStringSubstrings(DOB_VALUE) = WorkingComparisonStringSubstrings(DOB_VALUE) Then 
'You found a match. 
end if 
+0

這與字符串值比較有什麼關係? – Plutonix

+0

嗯,我剛寫完東西就像這樣,通過比較字符串值和這對我工作的兩個字典循環。 – Krev32