2011-09-28 86 views
0

我有一個簡單的例程,用於根據無序對象集合中的name屬性來查找下一個對象。我瀏覽集合並收集所有名稱,並在List(of String)中添加我的當前名稱爲>的任何名稱,該名稱應列出當前密鑰之後的所有內容。然後,我使用List(of String)上的默認.Sort()方法對列表進行排序,並選取列表中的第一個項目,這應該是我的下一個項目。我做相反的事情找到前一個項目,添加我所有的項目<我的當前名稱,排序,並採取列表中的最後一個項目。String.Sort和大於/小於運算符之間的區別VB.Net

但是,此方法會跳過一些項目。例如,我有一些名爲1210,1210-ADA和1210_ADA_DB的項目。使用此方法,獲取下一個項目將跳過中間項目1210-ADA並找到1210_ADA_DB,但找到上一個項目似乎可行。

如果我的過程是正確的,我唯一的解釋是<>運算符與.Sort()方法比較不同。這是真的?有什麼區別?

代碼尋找下一個項目:

 Dim Key As String = Name 
     Dim NameList As New List(Of String) 
     For Each obj As T In Collection 
      Dim ObjKey As String = Obj.Key 
      If ObjKey > Key Then 
       NameList.Add(ObjKey) 
      End If 
     Next 
     If NameList.Count = 0 Then Return Nothing 
     NameList.Sort() 
     Dim NextKey As String = NameList.First 
+2

而不是*描述*你的代碼,你爲什麼不*發佈*你的代碼? –

回答

1

我想你已經找到了問題所在。但是要註釋,你會被一些VB6 compat行爲所困擾。選項比較的默認值是使用String.CompareOrdinal()的二進制。不是什麼List.Sort()使用。選項比較文本使用CultureInfo.CompareInfo.Compare()與CompareOptions.IgnoreWidth,CompareOptions.IgnoreKanaType,CompareOptions.IgnoreCase選項。也不是什麼List.Sort()使用。

避免運算符並改用String.Compare()。

1

我唯一的解釋是,<和>操作比較不同於的.sort()方法。這是真的?

Sort內部使用String.IComparable(Of String).CompareTo方法其產生的結果與<>一致。

但是,只有在您沒有更改項目或當前文件的Option Compare時纔是如此。這將改變<>的行爲,但不會改變上述方法。

+0

我沒有改變選項比較。根據我的項目設置選項比較設置爲二進制,我會假設是默認值。 – Kratz

+0

您已經將我引導至我的答案,但< and >顯然仍與String.CompartTo不同,「CompareTo」的文檔說「此方法使用當前區域性執行文字比較(區分大小寫且文化敏感)。 ''和'選項Compart文本'說''基於字符串比較在不區分大小寫,由您的應用程序的區域設置決定的文本排序順序。' – Kratz

+0

@Kratz您引用的內容僅針對「Option Compare Text」。在'Option Compare Binary'下,它們表現相同(區分大小寫,區分文化)。 –

相關問題