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

14voto

anar khalilov Punkte 15972

Ich weiß, es ist ein bisschen chaotisch, aber wenn Sie ein Fan von Einzeilern sind, hier ist einer:

((Suit[])Enum.GetValues(typeof(Suit))).ToList().ForEach(i => DoSomething(i));

5 Stimmen

Ist das Lispeln ?

14voto

matt burns Punkte 23443
foreach (Suit suit in Enum.GetValues(typeof(Suit)))
{
}

(Die gegenwärtig akzeptierte Antwort hat eine Besetzung, die meiner Meinung nach nicht benötigt wird (obwohl ich mich irren kann).)

12voto

Gabriel Punkte 867

Ein einfacher und allgemeiner Weg, eine Aufzählung in etwas zu konvertieren, mit dem Sie interagieren können:

public static Dictionary<int, string> ToList<T>() where T : struct
{
   return ((IEnumerable<T>)Enum
       .GetValues(typeof(T)))
       .ToDictionary(
           item => Convert.ToInt32(item),
           item => item.ToString());
}

Und dann:

var enums = EnumHelper.ToList<MyEnum>();

0 Stimmen

A Dictionary ist keine gute Idee: Wenn Sie eine Enum wie enum E { A = 0, B = 0 } wird der Wert 0 2 Mal addiert, wodurch ein ArgumentException (Sie können nicht denselben Key in einem Dictionary 2 oder mehr Mal!).

0 Stimmen

Warum eine Dictionary<,> aus einer Methode namens ToList ? Auch warum nicht zurückkehren Dictionary<T, string> ?

12voto

Ross Gatih Punkte 621

Diese Frage wird in Kapitel 10 von " C# Schritt für Schritt 2013 "

Der Autor verwendet eine doppelte for-Schleife, um ein Paar von Enumeratoren zu durchlaufen (um ein vollständiges Kartenspiel zu erstellen):

class Pack
{
    public const int NumSuits = 4;
    public const int CardsPerSuit = 13;
    private PlayingCard[,] cardPack;

    public Pack()
    {
        this.cardPack = new PlayingCard[NumSuits, CardsPerSuit];
        for (Suit suit = Suit.Clubs; suit <= Suit.Spades; suit++)
        {
            for (Value value = Value.Two; value <= Value.Ace; value++)
            {
                cardPack[(int)suit, (int)value] = new PlayingCard(suit, value);
            }
        }
    }
}

In diesem Fall, Suit y Value sind beides Aufzählungen:

enum Suit { Clubs, Diamonds, Hearts, Spades }
enum Value { Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, Ace}

und PlayingCard ist ein Kartenobjekt mit einer definierten Suit y Value :

class PlayingCard
{
    private readonly Suit suit;
    private readonly Value value;

    public PlayingCard(Suit s, Value v)
    {
        this.suit = s;
        this.value = v;
    }
}

1 Stimmen

Funktioniert das auch, wenn die Werte in der Aufzählung nicht fortlaufend sind?

0 Stimmen

@AamirMasood Nein, das wird es nicht.

10voto

Slappywag Punkte 1113

Was, wenn Sie wissen, dass der Typ ein enum , aber Sie wissen nicht, was der genaue Typ zur Kompilierzeit ist?

public class EnumHelper
{
    public static IEnumerable<T> GetValues<T>()
    {
        return Enum.GetValues(typeof(T)).Cast<T>();
    }

    public static IEnumerable getListOfEnum(Type type)
    {
        MethodInfo getValuesMethod = typeof(EnumHelper).GetMethod("GetValues").MakeGenericMethod(type);
        return (IEnumerable)getValuesMethod.Invoke(null, null);
    }
}

Die Methode getListOfEnum verwendet Reflexion, um einen beliebigen Aufzählungstyp zu verwenden und gibt eine IEnumerable aller Enum-Werte.

Verwendung:

Type myType = someEnumValue.GetType();

IEnumerable resultEnumerable = getListOfEnum(myType);

foreach (var item in resultEnumerable)
{
    Console.WriteLine(String.Format("Item: {0} Value: {1}",item.ToString(),(int)item));
}

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