如何从集合VB.Net获取密钥和值

时间:2011-09-21 12:47:45

标签: 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)) 'Get value
        Debug.Print(sta(i).key) 'Get key ?
    Next

4 个答案:

答案 0 :(得分:4)

非常确定你不能直接Microsoft.VisualBasic.Collection

对于上面的示例代码,请考虑使用System.Collections.Specialized.StringDictionary。如果这样做,请注意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

答案 1 :(得分:3)

我不建议使用Collection类,因为这是在VB兼容性库中,以便更容易地迁移VB6程序。将其替换为System.Collections或System.Collections.Generic命名空间中的许多类之一。

答案 2 :(得分:2)

使用Reflection可以获得密钥。

 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中找到更多详细信息:How to use reflection to get keys from Microsoft.VisualBasic.Collection

答案 3 :(得分:0)

是的,它很可能,但我想建议你使用另一个Collection。

如何使用Reflection,Microsoft.VisualBasic.Collection类型包含一些私有字段,在这种情况下应该使用的字段是“m_KeyedNodesHash”字段,字段类型是System.Collections.Generic.Dictionary (Of String,Microsoft.VisualBasic.Collection.Node),它包含一个名为“Keys”的属性,其中返回类型是System.Collections.Generic.Dictionary(Of String,Microsoft.VisualBasic.Collection.Node).KeyCollection,获取某个键的唯一方法是将其转换为IEnumerable类型(Of String),并调用ElementAt函数。

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