4393 Stimmen

Wie man eine Aufzählung durchführt

Wie können Sie eine Aufzählung von enum in C#?

Der folgende Code lässt sich z. B. nicht kompilieren:

public enum Suit
{
    Spades,
    Hearts,
    Clubs,
    Diamonds
}

public void EnumerateAllSuitsDemoMethod()
{
    foreach (Suit suit in Suit)
    {
        DoSomething(suit);
    }
}

Und es gibt den folgenden Kompilierzeitfehler:

Anzug" ist ein "Typ", wird aber wie eine "Variable" verwendet

Es scheitert an der Suit Schlüsselwort, das zweite.

24 Stimmen

6 Stimmen

Vielleicht möchten Sie sich informieren über die Besonderheiten von C#-Enums in dem dies und andere nützliche Informationen über Enum erörtert werden

5299voto

jop Punkte 80065
foreach (Suit suit in (Suit[]) Enum.GetValues(typeof(Suit)))
{
}

Hinweis : Die Besetzung von (Suit[]) ist nicht unbedingt erforderlich, aber es macht den Code 0,5 ns schneller .

112 Stimmen

Dies funktioniert nicht, wenn Sie doppelte Werte in der Aufzählerliste haben.

2 Stimmen

@Jessy, wenn Sie alle Namen benötigen (einschließlich derjenigen mit doppelten Werten), versuchen Sie vielleicht Enum.GetNames in Verbindung mit Enum.Parse. Es wird ein wenig langsam sein, obwohl, empfehle ich es einmal während der Initialisierung (oder das erste Mal, wenn es benötigt wird) und Zwischenspeichern der Ergebnisse in ein Array.

13 Stimmen

Ich möchte nur darauf hinweisen, dass dies leider nicht in Silverlight funktionieren wird, da die Silverlight-Bibliothek nicht enthalten enum.GetValues . In diesem Fall müssen Sie die Reflexion verwenden.

827voto

Haacked Punkte 56079

Es sieht für mich so aus, als ob Sie wirklich die Namen der einzelnen Aufzählungen und nicht die Werte ausgeben möchten. In diesem Fall Enum.GetNames() scheint der richtige Ansatz zu sein.

public enum Suits
{
    Spades,
    Hearts,
    Clubs,
    Diamonds,
    NumSuits
}

public void PrintAllSuits()
{
    foreach (string name in Enum.GetNames(typeof(Suits)))
    {
        System.Console.WriteLine(name);
    }
}

Übrigens ist das Inkrementieren des Wertes keine gute Methode, um die Werte einer Aufzählung aufzuzählen. Sie sollten stattdessen dies tun.

Ich würde verwenden Enum.GetValues(typeof(Suit)) stattdessen.

public enum Suits
{
    Spades,
    Hearts,
    Clubs,
    Diamonds,
    NumSuits
}

public void PrintAllSuits()
{
    foreach (var suit in Enum.GetValues(typeof(Suits)))
    {
        System.Console.WriteLine(suit.ToString());
    }
}

5 Stimmen

VB-Syntax hier: Link

3 Stimmen

Ich habe Ihre Version mit folgenden kleinen Änderungen meinerseits übernommen: Enum.GetValues(typeof(Suits)).OfType<Suits>().ToArray() . In diesem Fall kann ich eine Reihe von Suits Enum-Elemente, nicht Strings.

5 Stimmen

@Barabas warum nicht einfach tun Suits suit in Enum.GetValues(typeof(Suits)) ?

391voto

bob Punkte 6307

Ich habe einige Erweiterungen für die einfache Verwendung von Enum gemacht. Vielleicht kann sie jemand verwenden...

public static class EnumExtensions
{
    /// <summary>
    /// Gets all items for an enum value.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">The value.</param>
    /// <returns></returns>
    public static IEnumerable<T> GetAllItems<T>(this Enum value)
    {
        foreach (object item in Enum.GetValues(typeof(T)))
        {
            yield return (T)item;
        }
    }

    /// <summary>
    /// Gets all items for an enum type.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">The value.</param>
    /// <returns></returns>
    public static IEnumerable<T> GetAllItems<T>() where T : struct
    {
        foreach (object item in Enum.GetValues(typeof(T)))
        {
            yield return (T)item;
        }
    }

    /// <summary>
    /// Gets all combined items from an enum value.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="value">The value.</param>
    /// <returns></returns>
    /// <example>
    /// Displays ValueA and ValueB.
    /// <code>
    /// EnumExample dummy = EnumExample.Combi;
    /// foreach (var item in dummy.GetAllSelectedItems<EnumExample>())
    /// {
    ///    Console.WriteLine(item);
    /// }
    /// </code>
    /// </example>
    public static IEnumerable<T> GetAllSelectedItems<T>(this Enum value)
    {
        int valueAsInt = Convert.ToInt32(value, CultureInfo.InvariantCulture);

        foreach (object item in Enum.GetValues(typeof(T)))
        {
            int itemAsInt = Convert.ToInt32(item, CultureInfo.InvariantCulture);

            if (itemAsInt == (valueAsInt & itemAsInt))
            {
                yield return (T)item;
            }
        }
    }

    /// <summary>
    /// Determines whether the enum value contains a specific value.
    /// </summary>
    /// <param name="value">The value.</param>
    /// <param name="request">The request.</param>
    /// <returns>
    ///     <c>true</c> if value contains the specified value; otherwise, <c>false</c>.
    /// </returns>
    /// <example>
    /// <code>
    /// EnumExample dummy = EnumExample.Combi;
    /// if (dummy.Contains<EnumExample>(EnumExample.ValueA))
    /// {
    ///     Console.WriteLine("dummy contains EnumExample.ValueA");
    /// }
    /// </code>
    /// </example>
    public static bool Contains<T>(this Enum value, T request)
    {
        int valueAsInt = Convert.ToInt32(value, CultureInfo.InvariantCulture);
        int requestAsInt = Convert.ToInt32(request, CultureInfo.InvariantCulture);

        if (requestAsInt == (valueAsInt & requestAsInt))
        {
            return true;
        }

        return false;
    }
}

Die Aufzählung selbst muss mit der Option FlaggenAttribut :

[Flags]
public enum EnumExample
{
    ValueA = 1,
    ValueB = 2,
    ValueC = 4,
    ValueD = 8,
    Combi = ValueA | ValueB
}

21 Stimmen

Ein Einzeiler für die erste Erweiterungsmethode; sie ist nicht mehr faul. return Enum.GetValues(typeof(T)).Cast<T>();

4 Stimmen

Alternativ können Sie auch OfType verwenden: Enum.GetValues(typeof(T)).OfType<T>(). Schade, dass es nicht eine generische Version von GetValues<T>() gibt, dann wäre es noch eleganter.

5 Stimmen

Vielleicht kann jemand zeigen, wie man diese Erweiterungen verwendet? Der Compiler zeigt keine Erweiterungsmethoden für enum EnumExample.

203voto

Ekevoo Punkte 2634

Einige Versionen des .NET-Frameworks unterstützen nicht Enum.GetValues . Hier ist ein guter Workaround von Ideen 2.0: Enum.GetValues im Compact Framework :

public Enum[] GetValues(Enum enumeration)
{
    FieldInfo[] fields = enumeration.GetType().GetFields(BindingFlags.Static | BindingFlags.Public);
    Enum[] enumerations = new Enum[fields.Length];

    for (var i = 0; i < fields.Length; i++)
        enumerations[i] = (Enum) fields[i].GetValue(enumeration);

    return enumerations;
}

Wie bei jedem Code, der die Reflexion sollten Sie dafür sorgen, dass sie nur einmal ausgeführt wird und die Ergebnisse zwischengespeichert werden.

23 Stimmen

Warum wird hier nicht das Schlüsselwort yield verwendet, anstatt eine Liste zu erstellen?

3 Stimmen

Oder kürzer: return type.GetFields().Where(x => x.IsLiteral).Select(x => x.GetValue(null)).Cast<Enum>();

12 Stimmen

@nawfal: Linq ist nicht verfügbar .Net CF 2.0.

184voto

Arad Punkte 3591

Neue .NET 5-Lösung:

.NET 5 hat eine neue neue generische Version für das GetValues Methode:

Suit[] suitValues = Enum.GetValues<Suit>();

was heute bei weitem die bequemste Art ist, dies zu tun.

Verwendung in einer foreach-Schleife:

foreach (Suit suit in Enum.GetValues<Suit>())
{

}

Und um Enum-Namen zu erhalten:

string[] suitNames = Enum.GetNames<Suit>();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X