Suche…


Aufzählungsdefinition

Ein Enum ist eine Menge logisch verwandter Konstanten.

Enum Size
    Small
    Medium
    Large
End Enum

Public Sub Order(shirtSize As Size)
    Select Case shirtSize
        Case Size.Small
            ' ...
        Case Size.Medium
            ' ...
        Case Size.Large
            ' ...
    End Select
End Sub

Member-Initialisierung

Jedes Enumerationsmitglied kann mit einem Wert initialisiert werden. Wenn für ein Element kein Wert angegeben ist, wird der Standardwert auf 0 gesetzt (wenn es das erste Mitglied in der Mitgliederliste ist) oder auf einen Wert, der um 1 größer ist als der Wert des vorhergehenden Mitglieds.

Module Module1

    Enum Size
        Small
        Medium = 3
        Large
    End Enum

    Sub Main()
        Console.WriteLine(Size.Small)    ' prints 0
        Console.WriteLine(Size.Medium)   ' prints 3
        Console.WriteLine(Size.Large)    ' prints 4

        ' Waits until user presses any key
        Console.ReadKey()
    End Sub

End Module

Das Attribut Flags

Mit dem Attribut <Flags> wird die Aufzählung zu einer Gruppe von Flags. Dieses Attribut ermöglicht das Zuweisen mehrerer Werte zu einer Aufzählungsvariablen. Die Mitglieder einer Flag-Enum sollten mit Potenzen von 2 (1, 2, 4, 8 ...) initialisiert werden.

Module Module1

    <Flags>
    Enum Material
        Wood = 1
        Plastic = 2
        Metal = 4
        Stone = 8
    End Enum

    Sub Main()
        Dim houseMaterials As Material = Material.Wood Or Material.Stone
        Dim carMaterials as Material = Material.Plastic Or Material.Metal
        Dim knifeMaterials as Material = Material.Metal

        Console.WriteLine(houseMaterials.ToString()) 'Prints "Wood, Stone"
        Console.WriteLine(CType(carMaterials, Integer)) 'Prints 6
    End Sub

End Module

HasFlag ()

Mit der HasFlag() -Methode kann HasFlag() werden, ob ein Flag gesetzt ist.

Module Module1

    <Flags>
    Enum Material
        Wood = 1
        Plastic = 2
        Metal = 4
        Stone = 8
    End Enum

    Sub Main()
        Dim houseMaterials As Material = Material.Wood Or Material.Stone

        If houseMaterials.HasFlag(Material.Stone) Then
            Console.WriteLine("the house is made of stone")
        Else
            Console.WriteLine("the house is not made of stone")
        End If
    End Sub

End Module

Weitere Informationen zum Flags-Attribut und seiner Verwendung finden Sie in der offiziellen Microsoft-Dokumentation .

String-Analyse

Eine Enum-Instanz kann erstellt werden, indem eine Zeichenfolgendarstellung des Enums analysiert wird.

Module Module1

    Enum Size
        Small
        Medium
        Large
    End Enum

    Sub Main()
        Dim shirtSize As Size =  DirectCast([Enum].Parse(GetType(Size), "Medium"), Size)

        ' Prints 'Medium'
        Console.WriteLine(shirtSize.ToString())

        ' Waits until user presses any key
        Console.ReadKey()
    End Sub

End Module

Siehe auch: Eine Zeichenfolge in einen Enum-Wert in VB.NET parsen

GetNames ()

Gibt die Namen der Konstanten im angegebenen Enum als String-Array zurück:

Module Module1

  Enum Size
    Small
    Medium
    Large
  End Enum

  Sub Main()
    Dim sizes = [Enum].GetNames(GetType(Size))

    For Each size In sizes
      Console.WriteLine(size)
      Next
  End Sub

End Module

Ausgabe:

Klein

Mittel

Groß

GetValues ​​()

"Diese Methode ist hilfreich für das Durchlaufen von Enum-Werten."

Enum Animal
    Dog = 1
    Cat = 2
    Frog = 4
End Enum

Dim Animals = [Enum].GetValues(GetType(Animal))

For Each animal in Animals
    Console.WriteLine(animal)
Next

Drucke:

1

2

4

ToString ()

Die ToString Methode für eine Aufzählung gibt den Namen der Aufzählung zurück. Zum Beispiel:

Module Module1
    Enum Size
        Small
        Medium
        Large
    End Enum

    Sub Main()
        Dim shirtSize As Size = Size.Medium
        Dim output As String = shirtSize.ToString()
        Console.WriteLine(output)  ' Writes "Medium"
    End Sub
End Module

Wenn jedoch die Zeichenfolgendarstellung des tatsächlichen Ganzzahlwerts der Aufzählung gewünscht wird, können Sie die Aufzählung in eine Integer ToString und ToString :

Dim shirtSize As Size = Size.Medium
Dim output As String = CInt(shirtSize).ToString()
Console.WriteLine(output)  ' Writes "1"

Bestimmen Sie, ob für ein Enum FlagsAttribute angegeben wurde oder nicht

Das nächste Beispiel kann verwendet werden, um zu bestimmen, ob für eine Enumeration FlagsAttribute angegeben wurde. Die angewandte Methodik basiert auf Reflection .

Dieses Beispiel ergibt ein True Ergebnis:

Dim enu As [Enum] = New FileAttributes()
Dim hasFlags As Boolean = enu.GetType().GetCustomAttributes(GetType(FlagsAttribute), inherit:=False).Any()
Console.WriteLine("{0} Enum has FlagsAttribute?: {1}", enu.GetType().Name, hasFlags)

Dieses Beispiel liefert ein False Ergebnis:

Dim enu As [Enum] = New ConsoleColor()
Dim hasFlags As Boolean = enu.GetType().GetCustomAttributes(GetType(FlagsAttribute), inherit:=False).Any()
Console.WriteLine("{0} Enum has FlagsAttribute?: {1}", enu.GetType().Name, hasFlags)

Wir können eine generische Nutzungserweiterungsmethode wie diese entwerfen:

<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Function HasFlagsAttribute(ByVal sender As [Enum]) As Boolean
    Return sender.GetType().GetCustomAttributes(GetType(FlagsAttribute), inherit:=False).Any()
End Function

Verwendungsbeispiel:

Dim result As Boolean = (New FileAttributes).HasFlagsAttribute()

For-Each-Flag (Flag-Iteration)

In einigen sehr spezifischen Szenarien würden wir die Notwendigkeit sehen, für jedes Flag der Quellenzählung eine spezifische Aktion auszuführen.

Wir können eine einfache generische Erweiterungsmethode schreiben, um diese Aufgabe zu realisieren.

<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Sub ForEachFlag(Of T)(ByVal sender As [Enum],
                             ByVal action As Action(Of T))

    For Each flag As T In sender.Flags(Of T)
        action.Invoke(flag)
    Next flag

End Sub

Verwendungsbeispiel:

Dim flags As FileAttributes = (FileAttributes.ReadOnly Or FileAttributes.Hidden)
    
flags.ForEachFlag(Of FileAttributes)(
      Sub(ByVal x As FileAttributes)
          Console.WriteLine(x.ToString())
      End Sub)

Bestimmen Sie die Anzahl der Flags in einer Flagkombination

Das nächste Beispiel soll die Anzahl der Flags in der angegebenen Flagkombination zählen.

Das Beispiel wird als Erweiterungsmethode bereitgestellt:

<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Function CountFlags(ByVal sender As [Enum]) As Integer
    Return sender.ToString().Split(","c).Count()
End Function

Verwendungsbeispiel:

Dim flags As FileAttributes = (FileAttributes.Archive Or FileAttributes.Compressed)
Dim count As Integer = flags.CountFlags()
Console.WriteLine(count)

Finden Sie den nächsten Wert in einer Aufzählung

Der nächste Code veranschaulicht, wie der nächste Wert einer Aufzählung ermittelt wird .

Zuerst definieren wir dieses Enum , das zur Angabe von Suchkriterien (Suchrichtung) dient.

Public Enum EnumFindDirection As Integer
    Nearest = 0
    Less = 1
    LessOrEqual = 2
    Greater = 3
    GreaterOrEqual = 4
End Enum

Und jetzt implementieren wir den Suchalgorithmus:

<DebuggerStepThrough>
Public Shared Function FindNearestEnumValue(Of T)(ByVal value As Long,
                                                  ByVal direction As EnumFindDirection) As T

    Select Case direction

        Case EnumFindDirection.Nearest
            Return (From enumValue As T In [Enum].GetValues(GetType(T)).Cast(Of T)()
                    Order By Math.Abs(value - Convert.ToInt64(enumValue))
                    ).FirstOrDefault

        Case EnumFindDirection.Less
            If value < Convert.ToInt64([Enum].GetValues(GetType(T)).Cast(Of T).First) Then
                Return [Enum].GetValues(GetType(T)).Cast(Of T).FirstOrDefault

            Else
                Return (From enumValue As T In [Enum].GetValues(GetType(T)).Cast(Of T)()
                        Where Convert.ToInt64(enumValue) < value
                        ).LastOrDefault
            End If

        Case EnumFindDirection.LessOrEqual
            If value < Convert.ToInt64([Enum].GetValues(GetType(T)).Cast(Of T).First) Then
                Return [Enum].GetValues(GetType(T)).Cast(Of T).FirstOrDefault

            Else
                Return (From enumValue As T In [Enum].GetValues(GetType(T)).Cast(Of T)()
                        Where Convert.ToInt64(enumValue) <= value
                        ).LastOrDefault
            End If

        Case EnumFindDirection.Greater
            If value > Convert.ToInt64([Enum].GetValues(GetType(T)).Cast(Of T).Last) Then
                Return [Enum].GetValues(GetType(T)).Cast(Of T).LastOrDefault

            Else
                Return (From enumValue As T In [Enum].GetValues(GetType(T)).Cast(Of T)()
                        Where Convert.ToInt64(enumValue) > value
                        ).FirstOrDefault
            End If

        Case EnumFindDirection.GreaterOrEqual
            If value > Convert.ToInt64([Enum].GetValues(GetType(T)).Cast(Of T).Last) Then
                Return [Enum].GetValues(GetType(T)).Cast(Of T).LastOrDefault

            Else
                Return (From enumValue As T In [Enum].GetValues(GetType(T)).Cast(Of T)()
                        Where Convert.ToInt64(enumValue) >= value
                        ).FirstOrDefault
            End If

    End Select

End Function

Verwendungsbeispiel:

Public Enum Bitrate As Integer
    Kbps128 = 128
    Kbps192 = 192
    Kbps256 = 256
    Kbps320 = 320
End Enum

Dim nearestValue As Bitrate = FindNearestEnumValue(Of Bitrate)(224, EnumFindDirection.GreaterOrEqual)


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow