我有一个结构“xyz”,里面有3个字符串对象。 “foo”“bar”和“abc”我想迭代结构并比较对象的名称。
Structure xyz
dim foo as string
dim bar as string
dim abc as string
End Structure
伪:
For each x as object in xyz
if x.Name = "foo" then
'bang
end if
End each
这可能吗?
答案 0 :(得分:3)
如果这只是一次性的事情,你可能会更容易使用词典,但如果你愿意保留结构,你可以用反射来做。
这个小代码片段会在StringBuilder
中为您列出每个结构成员。
Dim sbOutput As New System.Text.StringBuilder
Dim t As Type = GetType(xyz)
For Each p As System.Reflection.FieldInfo In t.GetFields()
sbOutput.AppendLine(p.Name)
Next
答案 1 :(得分:1)
一个老问题,但实际上我发现自己也需要这个,这是 Google 为我提供的最重要的结果之一,所以我想我会为将来通过这种方式来到这里的任何人做出贡献。< /p>
就我而言,我基本上将结构用作字符串的集合,我可以通过 StrucName.Value1
等轻松引用这些字符串(基本上是字符串的枚举,like asked about here),而不必尽可能担心拼写检查(就像您必须使用字典一样,无论您是否使用上面评论的 dict!foo
方法)。 90% 的使用我一次只需要一个或两个值,但我在我的代码中找到了一两个点,在那里循环遍历所有成员值并执行(基本上)会更好/更容易与每个操作相同的一组操作,而不是单独列出每个操作。
我找到了一个很好的答案,它不使用反射 on another site,其中一位评论者建议要么覆盖 ToString
函数,要么使用返回值数组的函数。当然,从技术上讲,这仍然需要您再写一遍结构体的所有成员,但如果反射真的很重性能,那么这可能会更好。
我最终使用该函数返回一个数组方法,如下所示:
Public Structure StrucName
Public Const Value1 As String = "Value1"
Public Const Value2 As String = "Value2"
Public Const Value3 As String = "Value3"
'etc
Public Shared Function GetMemberValues() As String()
Return {Value1, Value2, Value3} 'etc
End Function
End Structure
然后你可以在这样的代码中使用它:
Dim values As String() = StrucName.GetMemberValues()
For Each value As String In values
'do stuff
Next
如果您的结构具有多种值类型,则可以改用 ArrayList
。
Public Structure StrucName
Public Const Value1 As String = "Value1"
Public Const Value2 As Integer = 2
Public Const Value3 As Boolean = True
'etc
Public Shared Function GetMemberValues() As ArrayList
Return New ArrayList From {Value1, Value2, Value3} 'etc
End Function
End Structure
Dim values As ArrayList = StrucName.GetMemberValues()
For Each value As Object In values
'do stuff
Next
并且使用 ArrayList
方法,如果需要,您可以通过 value.GetType()
或任何其他类似的运算符或方法获取原始值的类型(因此,在我上面的示例中,将 {{ 1}} 在我们的“do stuff”区域将弹出带有“System.String”、“System.Int32”和“System.Boolean”的消息框。
我想这可以适应多种情况。例如,如果您需要成员名称和值,您可以返回一个 MsgBox(value.GetType().ToString())
:
Dictionary
或者,如果您使用的是足够新的 VB 版本(VB 14 或更高版本),则可以使用 Public Shared Function GetMemberValues() As Dictionary(Of String, Object)
Return New Dictionary(Of String, Object) From {{"Value1", Value1}, {"Value2", Value2}, {"Value3", Value3}} 'etc
End Function
运算符 (MS Doc here):
NameOf
Public Shared Function GetMemberValues() As Dictionary(Of String, Object)
Return New Dictionary(Of String, Object) From {{NameOf(Value1), Value1}, {NameOf(Value2), Value2}, {NameOf(Value3), Value3}} 'etc
End Function
而 Dim values As Dictionary(Of String, Object) = StrucName.GetMemberValues()
For Each kvp As KeyValuePair(Of String, Object) In values
'do stuff
Next
仍然坚持。