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

27voto

Mickey Perlstein Punkte 2144

Ich verwende ToString() und splitte und parse dann das gespuckte Array in Flags.

[Flags]
public enum ABC {
   a = 1,
   b = 2,
   c = 4
};

public IEnumerable<ABC> Getselected (ABC flags)
{
   var values = flags.ToString().Split(',');
   var enums = values.Select(x => (ABC)Enum.Parse(typeof(ABC), x.Trim()));
   return enums;
}

ABC temp= ABC.a | ABC.b;
var list = getSelected (temp);
foreach (var item in list)
{
   Console.WriteLine(item.ToString() + " ID=" + (int)item);
}

21voto

nawfal Punkte 65966

Ich bin nicht der Meinung, dass dies besser oder gar gut ist. Ich zeige nur eine weitere Lösung auf.

Wenn die Werte der Aufzählung streng von 0 bis n - 1 reichen, ist eine allgemeine Alternative:

public void EnumerateEnum<T>()
{
    int length = Enum.GetValues(typeof(T)).Length;
    for (var i = 0; i < length; i++)
    {
        var @enum = (T)(object)i;
    }
}

Wenn die Werte der Aufzählung zusammenhängend sind und Sie das erste und letzte Element der Aufzählung angeben können, dann:

public void EnumerateEnum()
{
    for (var i = Suit.Spade; i <= Suit.Diamond; i++)
    {
        var @enum = i;
    }
}

Aber das ist keine strenge Aufzählung, sondern nur eine Schleife. Die zweite Methode ist jedoch viel schneller als jeder andere Ansatz...

0 Stimmen

Dies funktioniert nicht, wenn den Enum-Mitgliedern ein bestimmter Wert zugewiesen wird.

20voto

dmihailescu Punkte 1515

Wenn Sie Geschwindigkeit und Typüberprüfung bei der Erstellung und zur Laufzeit benötigen, ist diese Hilfsmethode besser als die Verwendung von LINQ zum Casting jedes Elements:

public static T[] GetEnumValues<T>() where T : struct, IComparable, IFormattable, IConvertible
{
    if (typeof(T).BaseType != typeof(Enum))
    {
        throw new ArgumentException(string.Format("{0} is not of type System.Enum", typeof(T)));
    }
    return Enum.GetValues(typeof(T)) as T[];
}

Und Sie können es wie unten beschrieben verwenden:

static readonly YourEnum[] _values = GetEnumValues<YourEnum>();

Natürlich können Sie zurückkehren IEnumerable<T> aber das bringt Ihnen hier nichts.

4 Stimmen

Beginnend mit C# 7.3 (Visual Studio 2017 v15.7), kann man where T: Enum

19voto

jhilden Punkte 11631

Hier ist ein Arbeitsbeispiel für die Erstellung von Auswahloptionen für eine DDL :

var resman = ViewModelResources.TimeFrame.ResourceManager;

ViewBag.TimeFrames = from MapOverlayTimeFrames timeFrame
      in Enum.GetValues(typeof(MapOverlayTimeFrames))
      select new SelectListItem
      {
         Value = timeFrame.ToString(),
         Text = resman.GetString(timeFrame.ToString()) ?? timeFrame.ToString()
      };

17voto

MUT Punkte 526

Methode hinzufügen public static IEnumerable<T> GetValues<T>() für Ihre Klasse, wie:

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

Aufruf und Übergabe der Aufzählung. Jetzt können Sie sie durchlaufen mit foreach :

 public static void EnumerateAllSuitsDemoMethod()
 {
     // Custom method
     var foos = GetValues<Suit>();
     foreach (var foo in foos)
     {
         // Do something
     }
 }

0 Stimmen

Ich würde "where T : struct, Enum" hinzufügen, um die Methode auf Enums zu beschränken. Etwa so: public static IEnumerable<T> ObtenerValores<T>() where T : struct, Enum => Enum.GetValues(typeof(T)).Cast<T>();

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