2013-02-17 39 views
0

我想把舊的VB6代碼帶到現代的VB.NET代碼中。VB.NET我應該使用一個集合嗎?

在我的VB6代碼中,我需要查詢集合中是否存在某個鍵。

我不喜歡這樣寫道:

Private Function pIndexFromKey(ByRef uCol As Collection, ByVal uText As String) As Long 
    On Error Resume Next 
    Dim lRet& 
    lRet = uCol.Item(uText) 
    pIndexFromKey = lRet 
End Function 

如果pIndexFromKey返回0,我知道,關鍵是不包含在集合中,我添加它是這樣的:

nCollection.Add(lIndex, sText) 

我想知道這是不是很好的做法。我認爲不是因爲在.NET中我使用的是VisualBasic集合,事實上它是「VB」而不是系統集合,這讓我感到懷疑。

從記錄上來看,這是我的VB.NET代碼:

Private Function pIndexFromKey(ByRef uCol As Collection, ByVal uText As String) As Integer 
    On Error Resume Next 
    Dim lRet As Integer = CInt(uCol(uText)) 
    Return lRet 
End Function 

的代碼工作正常,但我在錯誤恢復下一頁方法看起來醜陋,我不喜歡調試窗口,告訴每當錯誤被拋出(並被吃掉)時,我都會遇到這個異常。

有沒有人有更好的想法?

+0

快速提示:你不需要標記'uCol'爲'ByRef'在.NET中,因爲它是引用類型。 – 2013-02-17 09:01:46

回答

1

你可以使用一個Generic.Dictionary(字符串,整數)。因此,而不是這樣的:

Private Function pIndexFromKey(ByRef uCol As Collection, ByVal uText As String) As Integer 
    On Error Resume Next 
    Dim lRet As Integer = CInt(uCol(uText)) 
    Return lRet 
End Function 

你必須這樣:

Private Function pIndexFromKey(dict As Dictionary(Of String, Integer), uText As String) As Integer 
    Dim lRet As Integer 
    If dict.TryGetValue(uText, lRet) Then Return lRet 
    Return -1 'default value if key was not found in the dictionary 
End Function 
+0

無論「TryGetValue」是否表示失敗,您都可以將lRet初始化爲-1並返回。 – 2013-02-17 13:42:44

+0

@StevenDotNet:如果TryGetValue失敗,lRet將爲0(該類型的默認值),無論初始化值如何。爲了清晰起見,我修正了代碼。 – Neolisk 2013-02-17 14:13:24

+0

呃你說得對。我不認爲TryAction方法會在它指示失敗時重置變量。我的錯。 – 2013-02-17 15:25:13

0

如果你有Vb.Net,你可以處理錯誤在嘗試使用 實例: 嘗試

抓住EX作爲例外

結束Try

我希望我理解正確

+0

我想知道在我的情況下是否有比使用VisualBasic集合更優雅的方法。 – tmighty 2013-02-17 08:35:25

1

您可以簡單地使用contains方法來檢查密鑰是否存在。

+0

你喜歡我的VB收集方法,還是有什麼更快的我的情況? – tmighty 2013-02-17 08:58:05

+0

.net中有更好的方法,請查看system.collections.generic命名空間中可用的集合,並且可以使用適合您的情況的任何內容。 http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx – Bushbert 2013-02-17 09:10:55

1

我不會使用「在錯誤的下一步」的方法。 只需使用「contains」方法測試集合。

Dim Ret as integer 
Ret=0 
If (uCol.contains(uText)) then 
    Ret= CInt(uCol(uText)) 
Return ret 
0

我更換VisualBasic.CollectionObjectModel.Collection(Of T)對於初學者。然後,擺脫您的自定義功能,只需檢查Contains()方法。

Dim nCollection As New ObjectModel.Collection(Of String) 
    Dim sText As String = "value" 

    If Not nCollection.Contains(sText) Then 
     nCollection.Add(uText) 
    End If 

    If nCollection.Contains(sText) Then 
     Dim index = nCollection.IndexOf(sText) 
    End If 
+0

但我也需要得到這個鍵的索引,所以只是字符串的集合不起作用。 – tmighty 2013-02-17 09:11:00

+0

真的沒問題。我更新了我的答案。 – 2013-02-17 09:15:58

1

刪除您的VB集合並使用高級通用列表。

在你的情況,我懷疑你正在使用一個簡單的列表(字符串)。
如果是這樣,使用這種替代你的方法

Dim k as List(Of String) = new List(Of String) 
k.Add("Test1") 
k.Add("Test2") 
k.Add("Test3") 
k.Add("Test4") 
k.Add("Test5") 

' No need to use Contains, IndexOf doesn't throw exceptions if the element is not there 
Dim x = k.IndexOf("Test4") 
if x = -1 then 
     Console.WriteLine("Test4 is not in list") 
else 
     Console.WriteLine("Test4 is at index" + x.ToString) 
End if