VB.NET迭代结构的对象

时间:2012-01-05 19:33:55

标签: vb.net iteration structure

我有一个结构“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

这可能吗?

2 个答案:

答案 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 仍然坚持。