Zoeken…


Enum-definitie

Een opsomming is een set logisch gerelateerde constanten.

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

Initialisatie van leden

Elk van de opsommingsleden kan worden geïnitialiseerd met een waarde. Als er geen waarde is opgegeven voor een lid, wordt deze standaard geïnitialiseerd op 0 (als dit het eerste lid in de ledenlijst is) of op een waarde groter dan 1 dan de waarde van het voorgaande lid.

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

Het kenmerk Vlaggen

Met het attribuut <Flags> wordt het getal een reeks vlaggen. Met dit kenmerk kunnen meerdere waarden aan een enum-variabele worden toegewezen. De leden van een vlaggenlijst moeten worden geïnitialiseerd met bevoegdheden van 2 (1, 2, 4, 8 ...).

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 ()

De methode HasFlag() kan worden gebruikt om te controleren of een vlag is ingesteld.

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

Raadpleeg de officiële Microsoft-documentatie voor meer informatie over het kenmerk Flags en hoe dit moet worden gebruikt.

String parsing

Een Enum-instantie kan worden gemaakt door een tekenreeksrepresentatie van de Enum te parseren.

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

Zie ook: Parseer een string naar een Enum-waarde in VB.NET

GetNames ()

Retourneert de namen van constanten in het opgegeven Enum als een stringarray:

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

Output:

Klein

Medium

Groot

GetValues ()

'Deze methode is handig voor het herhalen van Enum-waarden'

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

prints:

1

2

4

ToString ()

De methode ToString op een opsomming retourneert de tekenreeksnaam van de opsomming. Bijvoorbeeld:

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

Als de tekenreeksrepresentatie van de werkelijke waarde van het gehele getal echter gewenst is, kunt u het Integer naar een geheel Integer casten en vervolgens ToString aanroepen:

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

Bepaal of voor een Enum FlagsAttribute is opgegeven of niet

Het volgende voorbeeld kan worden gebruikt om te bepalen of voor een opsomming het FlagsAttribute is opgegeven. De gebruikte methode is gebaseerd op Reflectie .

Dit voorbeeld geeft een True resultaat:

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)

Dit voorbeeld geeft een False resultaat:

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)

We kunnen een generieke methode voor uitbreiding van het gebruik zoals deze ontwerpen:

<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

Gebruiksvoorbeeld:

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

Voor elke vlag (vlag iteratie)

In sommige zeer specifieke scenario's zouden we de behoefte voelen om een specifieke actie uit te voeren voor elke vlag van de bronvermelding.

We kunnen een eenvoudige generieke uitbreidingsmethode schrijven om deze taak te realiseren.

<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

Gebruiksvoorbeeld:

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

Bepaal het aantal vlaggen in een vlagcombinatie

Het volgende voorbeeld is bedoeld om het aantal vlaggen in de opgegeven vlagcombinatie te tellen.

Het voorbeeld wordt verstrekt als een uitbreidingsmethode:

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

Gebruiksvoorbeeld:

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

Zoek de dichtstbijzijnde waarde in een Enum

De volgende code laat zien hoe u de dichtstbijzijnde waarde van een Enum kunt vinden .

Eerst definiëren we dit Enum dat dient om zoekcriteria op te geven (zoekrichting)

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

En nu implementeren we het zoekalgoritme:

<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

Gebruiksvoorbeeld:

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow