如何从VB.Net集合中获取键和值

如何从VB.Net集合中获取键和值,vb.net,visual-studio,Vb.net,Visual Studio,在遍历vb.net集合时,如何从该集合中获取键值 Dim sta As New Collection sta.Add("New York", "NY") sta.Add("Michigan", "MI") sta.Add("New Jersey", "NJ") sta.Add("Massachusetts", "MA") For i As Integer = 1 To sta.Count Debug.Print(sta(i)) '

在遍历vb.net集合时,如何从该集合中获取键值

    Dim sta As New Collection
    sta.Add("New York", "NY")
    sta.Add("Michigan", "MI")
    sta.Add("New Jersey", "NJ")
    sta.Add("Massachusetts", "MA")

    For i As Integer = 1 To sta.Count
        Debug.Print(sta(i)) 'Get value
        Debug.Print(sta(i).key) 'Get key ?
    Next

很确定你不能从一个直道

对于上面的示例代码,请考虑使用如果这样做,请注意Add方法的参数首先从VB集合键反转,然后是值

Dim sta As New System.Collections.Specialized.StringDictionary
sta.Add("NY", "New York")
'...

For Each itemKey in sta.Keys
    Debug.Print(sta.Item(itemKey)) 'value
    Debug.Print(itemKey) 'key
Next

我不建议使用Collection类,因为它位于VB兼容性库中,可以更轻松地迁移VB6程序。将其替换为System.Collections或System.Collections.Generic命名空间中的多个类之一。

使用反射可以获取密钥

 Private Function GetKey(Col As Collection, Index As Integer)
    Dim flg As BindingFlags = BindingFlags.Instance Or BindingFlags.NonPublic
    Dim InternalList As Object = Col.GetType.GetMethod("InternalItemsList", flg).Invoke(Col, Nothing)
    Dim Item As Object = InternalList.GetType.GetProperty("Item", flg).GetValue(InternalList, {Index - 1})
    Dim Key As String = Item.GetType.GetField("m_Key", flg).GetValue(Item)
    Return Key
 End Function
建议不要使用VB.Collection,但有时我们在处理过去使用的代码。请注意,使用未记录的私有方法是不安全的,但在没有其他解决方案的情况下,它是合理的


更多已删除的信息可以在SO中找到:

是的,可能很好,但我建议您使用另一个集合

如何处理反射,类型Microsoft.VisualBasic.Collection包含一些私有字段,在本例中应使用的字段为“m_KeyedNodesHash”字段,字段类型为System.Collections.Generic.Dictionary(字符串,Microsoft.VisualBasic.Collection.Node),它包含一个名为“Keys”的属性,其中,返回类型为System.Collections.Generic.Dictionary(字符串类型,Microsoft.VisualBasic.Collection.Node).KeyCollection,获取某个键的唯一方法是将其转换为IEnumerable类型(字符串类型),并调用函数中的元素

Private Function GetKey(ByVal col As Collection, ByVal index As Integer)
    Dim listfield As FieldInfo = GetType(Collection).GetField("m_KeyedNodesHash", BindingFlags.NonPublic Or BindingFlags.Instance)
    Dim list As Object = listfield.GetValue(col)
    Dim keylist As IEnumerable(Of String) = list.Keys
    Dim key As String = keylist.ElementAt(index)
    Return key
End Function

我同意。我一直使用泛型,但是我得到了一个我无法控制的dll,它返回一个带键的集合。