如何检查密钥是否存在于集合中

时间:2017-02-17 07:13:02

标签: vb6

我想在visual basic 6.0中检查集合变量是否包含密钥 下面是我正在收集的变量

pcolFields As Collection

我想检查它是否包含字段Event_Code。我这样做如下,但它对我不起作用。

    If IsMissing(pcolFields("Event_Code")) = False Then
        'Do Something
    End If

4 个答案:

答案 0 :(得分:3)

以下是try-catch的示例解决方案:

Private Function IsMissing(col As Collection, field As String)
On Error GoTo IsMissingError
    Dim val As Variant
    val = col(field)
    IsMissing = False
    Exit Function
IsMissingError:
    IsMissing = True
End Function

像这样使用:

Private Sub Form_Load()
    Dim x As New Collection
    x.Add "val1", "key1"

    Dim testkey As String
    testkey = "key2"
    If IsMissing(x, testkey) Then
        Debug.Print "Key is Missing"
    Else
        Debug.Print "Val is " + x(testkey)
    End If

    Exit Sub
End Sub

您还可以尝试a实现或子类化集合并添加“has”函数

答案 1 :(得分:0)

如果需要检查是否存在,集合是没有用的,但它们对迭代很有用。但是,集合是Variants的集合,因此本质上比类型变量慢。

几乎在每种情况下,使用类型化数组都更有用(也更优化)。如果你需要一个键控集合,你应该使用Dictionary对象。

使用类型化数组的一般方法的一些示例:

Dim my_array() As Long ' Or whichever type you need
Dim my_array_size As Long
Dim index As Long
Dim position As Long

' Add new item (push)
ReDim Preserve my_array(my_array_size)
my_array(my_array_size) = 123456 ' something to add
my_array_size = my_array_size + 1

' Remove item (pop)
my_array_size = my_array_size - 1
If my_array_size > 0 Then
    ReDim Preserve my_array(my_array_size - 1)
Else
    Erase my_array
End If

' Remove item (any position)
position = 3 'item to remove
For index = position To my_array_size - 2
    my_array(index) = my_array(index + 1)
Next
my_array_size = my_array_size - 1
ReDim Preserve my_array(my_array_size - 1)

' Insert item (any position)
ReDim Preserve my_array(my_array_size)
my_array_size = my_array_size + 1
For index = my_array_size - 1 To position + 1 Step -1
    my_array(index) = my_array(index - 1)
Next
my_array(position) = 123456 ' something to insert

' Find item
For index = 0 To my_array_size - 1
    If my_array(index) = 123456 Then
        Exit For
    End If
Next
If index < my_array_size Then
    'found, position is in index
Else
    'not found
End If

虽然它看起来像很多代码。它更快。 Intellisense也会起作用,这是一个奖励。唯一需要注意的是,如果你有非常大的数据集,那么redim开始变慢,你必须使用略有不同的技术。

您还可以使用Dictionary,确保在项目中包含Microsoft Scripting Runtime引用:

Dim dict As New Dictionary
Dim value As Long

dict.Add "somekey", 123456

dict.Remove "somekey"

value = dict.Item("somekey")

If dict.Exists("somekey") Then
    ' found!
Else
    ' not found
End If

像集合这样的字典只包含一堆变体,因此可以容纳对象等。

答案 2 :(得分:0)

如果Collection包含对象而不是原始类型,则efkah中的方法将失败。这是一个小调整:

'Test if a key is available in a collection
Public Function HasKey(coll As Collection, strKey As String) As Boolean
    On Error GoTo IsMissingError
        Dim val As Variant
'        val = coll(strKey)
        HasKey = IsObject(coll(strKey))
        HasKey = True
        On Error GoTo 0
        Exit Function
IsMissingError:
        HasKey = False
        On Error GoTo 0
End Function

答案 3 :(得分:0)

我们可以将下面的代码校验成vb.net代码

如果 Collection.ContainsKey(KeyString) 那么

'写代码

如果结束

Collection 是Dictionary 的变量,KeyString 是我们需要在collection 中找到的关键字符串