如何在迭代它时从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
答案 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