【问题标题】:Avoid duplicate values in Collection避免 Collection 中的重复值
【发布时间】:2013-09-14 07:53:44
【问题描述】:

我有以下值,我想将它们添加到集合中。如果值已在集合中,则消息应显示“这已添加到您的集合中”。

Dim OrdLines As New Collection

OrdLines.Add (111,this is first item)

OrdLines.Add (222,this is second item)

OrdLines.Add (333,this is third item)

OrdLines.Add (444,this is fourth item)

如何避免集合中的重复值?

【问题讨论】:

    标签: vba vb6


    【解决方案1】:

    为避免重复without any prompts,请使用此方法。

    代码

    Sub Sample()
        Dim col As New Collection
        Dim itm
    
        On Error Resume Next
        col.Add 111, Cstr(111)
        col.Add 222, Cstr(222)
        col.Add 111, Cstr(111)
        col.Add 111, Cstr(111)
        col.Add 333, Cstr(333)
        col.Add 111, Cstr(111)
        col.Add 444, Cstr(444)
        col.Add 555, Cstr(555)
        On Error GoTo 0
    
        For Each itm In col
            Debug.Print itm
        Next
    End Sub
    

    屏幕截图

    说明

    集合是一组有序的项目,您可以将其称为一个单元。语法是

    col.Add item, key, before, after
    

    一个集合不能有两次相同的键,所以我们正在做的是使用我们正在添加的项目创建一个键。这将确保我们不会得到重复。 On Error Resume Next 只是告诉代码忽略我们在尝试添加重复项时遇到的错误,然后继续前进到下一个要添加的项目。 CHR(34) 就是" 所以上面的语句也可以写成

    col.Add 111, """" & 111 & """"
    

    推荐阅读

    The Visual Basic Collection Object

    HTH

    【讨论】:

    • 使用Chr(34)"""" 有什么意义?为什么不用CStr() 包裹它?
    • @PhoenixX_2: 是的,你说得有道理,我完全没有想到 :)
    【解决方案2】:

    这是字典提供一些优势的场景之一。

    Option Explicit
    
    'Requires a reference to Microsoft Scripting Runtime.
    
    Private Sub Main()
        Dim Dict As Scripting.Dictionary 'As New XXX adds overhead.
        Dim Item As Variant
    
        Set Dict = New Scripting.Dictionary
        With Dict
            .Item(111) = 111
            .Item(222) = 222
            .Item(111) = 111
            .Item(111) = 111
            .Item(333) = 333
            .Item(111) = 111
            .Item(222) = 222
            .Item(333) = 333
    
            For Each Item In .Items
                Debug.Print Item
            Next
        End With
    End Sub
    

    【讨论】:

    • +1 用于推荐词典。我想很多人只是不知道它们或如何使用它们。不过,这是使用它们的好方法,因为如果项目不存在,初始调用会创建项目,随后对同一项目的调用只会覆盖它。你甚至不需要使用.add 方法。干得好!
    【解决方案3】:

    有一个built in method that allows you check for duplicates,假设您总是分配一个Key 值。这比On Error Resume Next 更好。

    If Not OrdLines.Contains(key_value) Then
        OrdLines.Add(item_value, key_value, before, after)
    End If
    

    注意这是 VB.NET,不是 VBA/VB6。在 VBA/VB6 中,您可以编写类似于 the approach given, here 的自定义函数。

    【讨论】:

    • 这是为 VB.NET 而不是 VB6/VBA。
    • @PhoenixX_2 语法相同。我一直在 VBA 中使用这种方法。这是一个完全有效的答案。
    • 但是现在我已经更改了我的链接(认为你虽然它应该是一个指向 VB.NET 的链接),现在我丢失了旧 URL,所以是的,现在 URL 指向 VB.NET,但无论如何方法和语法都是一样的。
    • 我收到“对象不支持此属性或方法”。错误。我希望你说的是真的,因为我在我的项目中也使用了On Error Resume Next :(.
    • 啊,你说得对,我一定一直在想dictionary.Exists 方法...我最近写了一个 UDF 来在向量数组上复制这个方法,我想我可能也这样做了Collection objects,所以这一定是我在想的。谢谢你让我直截了当:)
    【解决方案4】:

    Add 方法与键一起使用。

    语法:

    OrderLines.Add(ObjectToAdd, Key)
    

    记住 key 是一个字符串。

    例子:

    OrdLines.Add(222,"222")
    OrdLines.Add(222,"333")
    OrdLines.Add(222,"444")
    
    OrdLines.Add(222,"222") 'This will give error
    

    【讨论】:

      猜你喜欢
      • 2016-08-26
      • 2015-08-09
      • 1970-01-01
      • 2019-06-15
      • 2020-09-23
      • 1970-01-01
      • 2013-01-31
      • 2016-04-16
      • 1970-01-01
      相关资源
      最近更新 更多