So erhalten Sie den Enum-Indexwert in C#

Lesezeit: 5 Minuten

In C, enums, entspricht intern einer ganzen Zahl. Daher können wir Datentypen von behandeln enum auch als Ganzzahl.

Wie erreicht man dasselbe mit C#?

  • Duplikat: stackoverflow.com/questions/29482/cast-int-to-enum-in-c (ah, und enum to int ist nur eine Umwandlung, wie andere beantworteten)

    – Dmitri

    2. Juni 2011 um 10:47 Uhr


  • @Dmitry: Sieht so aus, als wäre der andere Beitrag tatsächlich das Gegenteil 🙂

    – Shamim Hafiz – MSFT

    2. Juni 2011 um 11:12 Uhr

Benutzeravatar von Iain Ward
Ian Ward

Erstens könnte es zwei Werte geben, auf die Sie sich beziehen:

Basiswert

Wenn Sie nach dem zugrunde liegenden Wert fragen, könnte dies einer dieser Typen sein: byte, sbyte, short, ushort, int, uint, long oder ulong

Dann können Sie es einfach in den zugrunde liegenden Typ umwandeln. Angenommen es ist ein intdas kannst du so machen:

int eValue = (int)enumValue;

Jedoch, beachten Sie auch den Standardwert jedes Elements (erstes Element ist 0, zweites ist 1 usw.) und die Tatsache, dass jedem Element ein neuer Wert zugewiesen werden könnte, der nicht unbedingt in einer bestimmten Reihenfolge sein muss! (Gutschrift an @JohnStock für den Hinweis zur Klärung).

Dieses Beispiel weist jedem einen neuen Wert zu und zeigt den zurückgegebenen Wert:

public enum MyEnum
{
    MyValue1 = 34,
    MyValue2 = 27
}

(int)MyEnum.MyValue2 == 27; // True

Indexwert

Der obige Wert ist im Allgemeinen der am häufigsten erforderliche Wert, und Ihr Fragedetail legt nahe, dass Sie ihn benötigen, jedoch hat jeder Wert auch einen Indexwert (auf den Sie sich im Titel beziehen). Wenn Sie dies benötigen, finden Sie weitere Informationen unten in den anderen Antworten.

  • Der int-Wert ist nicht unbedingt der Index, wie in der Antwort von user1027167 unten gezeigt. Beim zweiten Nachdenken glaube ich nicht, dass es klar ist, ob OP tatsächlich den Index oder den Int-Wert will …

    – Svend Hansen

    5. September 2019 um 14:41 Uhr


  • Diese Antwort ist falsch und macht große Annahmen über Ihre Aufzählung, damit sie funktioniert.

    – Johannes Stock

    9. Oktober 2020 um 20:36 Uhr

  • @JohnStock Entschuldigung, inwiefern ist es falsch? Können Sie das bitte näher erläutern? Denken Sie daran, dass es vor fast 10 Jahren geschrieben wurde und als Antwort auf jemanden geschrieben wurde, der scheinbar eine einfache Antwort auf eine einfache Frage wollte, also wurden ja Annahmen getroffen und offensichtlich kann es wie immer komplizierter sein, aber es scheint so haben befriedigt, was sie suchten!

    – Iain Ward

    10. Oktober 2020 um 22:51 Uhr

  • OP fragt nach einem Index. Ihre Antwort geht davon aus, dass eine Aufzählung einen konsistenten Satz aufeinanderfolgender inkrementierender Werte wie 1,2,3,4,5 hat, was bei Aufzählungen natürlich sehr oft nicht zutrifft. Es könnte in umgekehrter Reihenfolge, nicht aufeinanderfolgend, scheinbar zufällige Werte oder sogar überhaupt keine Zahlen sein. Sie sollten Ihre Antwort löschen, da sie nur für einen ganz bestimmten Anwendungsfall funktioniert und in anderen Fällen Fehler verursacht. Wenn Sie die anderen Antworten auf dieser Seite lesen, wurde auf diesen Fehler in Ihrer Lösung (und anderen Personen) mehrfach hingewiesen. In 10 Jahren hat sich nichts geändert

    – Johannes Stock

    12. Oktober 2020 um 15:44 Uhr

  • @JohnStock Ahh, ich verstehe! Okay, OK, ich verstehe, was du sagst, aber um ehrlich zu sein, kommt es auf deine Interpretation an, was er fragt. Obwohl er im Titel „Index“ angibt (und ich gebe zu, dass ich das verpasst habe), deutet seine eigentliche Frage zu Aufzählungen, die einer Ganzzahl entsprechen, darauf hin, und ich glaube an die meisten Situationen, dass sie sich auf den zugrunde liegenden Wert der Aufzählung bezieht und nicht insbesondere der Indexwert selbst. Ich kann mir keine Situation vorstellen, in der ich jemals selbst den Indexwert benötigt hätte! (Gibt es eine??) Also ja, ich habe da eine Annahme getroffen und glaube immer noch, dass es die richtige Entscheidung war, als er sie akzeptierte.

    – Iain Ward

    13. Oktober 2020 um 20:03 Uhr

Eine andere Möglichkeit, einen Enum-Typ in einen Int umzuwandeln:

enum E
{
    A = 1,   /* index 0 */
    B = 2,   /* index 1 */
    C = 4,   /* index 2 */
    D = 4    /* index 3, duplicate use of 4 */
}

void Main()
{
    E e = E.C;
    int index = Array.IndexOf(Enum.GetValues(e.GetType()), e);
    // index is 2

    E f = (E)(Enum.GetValues(e.GetType())).GetValue(index);
    // f is  E.C
}

Komplexer, aber unabhängig von den den Aufzählungswerten zugewiesenen INT-Werten.

  • Dies ist eine bessere Antwort als die akzeptierte (oder die vielen anderen ähnlichen Antworten), da alle davon auszugehen scheinen, dass Ihre Aufzählungswerte mit sequentiellen numerischen Werten zugewiesen werden und dies häufig nicht der Fall ist.

    – Christoph König

    6. Dezember 2017 um 0:46 Uhr

  • Monster!!!! Gute Antwort. Funktionierte perfekt in einer Methode mit Verallgemeinerung von Enum Type! Vielen Dank

    – Peter R

    2. Dezember 2019 um 12:11 Uhr

  • Vorsicht bei der Verwendung von Flags, der Index wird anhand des numerisch sortierten Werts des Flags berechnet und nicht anhand der Reihenfolge, in der sie definiert sind. Wenn Sie im obigen Beispiel stattdessen A = 1, C = 4, B = 2 definieren, hat B immer noch einen Index von 1, obwohl es nach C definiert wurde. Dies kann zu unerwarteten Ergebnissen führen, wenn zusammengesetzte Flags verwendet werden. Wenn wir im obigen Beispiel wieder ein neues Flag „AB = A | B“ hinzufügen, dann ist sein Wert 3, und der Index von C ändert sich von 2 im obigen Beispiel auf 3, da „AB“ zwischen B und C eingefügt ist in Indexreihenfolge.

    – JimbobTheSailor

    15. September 2020 um 5:10 Uhr


Standardmäßig ist der zugrunde liegende Typ jedes Elements in der Aufzählung ganzzahlig.

enum Values
{
   A,
   B,
   C
}

Sie können auch einen benutzerdefinierten Wert für jedes Element angeben:

enum Values
{
   A = 10,
   B = 11,
   C = 12
}
int x = (int)Values.A; // x will be 10;

Hinweis: Standardmäßig hat der erste Enumerator den Wert 0.

  • Was ist mit dem zweiten Zählerwert? ist es 1?

    – Fuat

    30. Januar 2019 um 13:44 Uhr

Benutzeravatar von Durgesh Pandey
Durgesh Pandey

Sie können es direkt übertragen:

enum MyMonthEnum { January = 1, February, March, April, May, June, July, August, September, October, November, December };

public static string GetMyMonthName(int MonthIndex)
{
  MyMonthEnum MonthName = (MyMonthEnum)MonthIndex;
  return MonthName.ToString();
}

Zum Beispiel:

string MySelectedMonthName=GetMyMonthName(8);
 //then MySelectedMonthName value will be August.

Einfaches Casting verwenden:

int value = (int) enum.item;

Beziehen auf enum (C#-Referenz)

Benutzeravatar von thumbmunkeys
Daumenmücken

Verwenden Sie eine Besetzung:

public enum MyEnum : int    {
    A = 0,
    B = 1,
    AB = 2,
}


int val = (int)MyEnum.A;

Benutzeravatar von Aravind
Aravind

using System;
public class EnumTest 
{
    enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

    static void Main() 
    {

        int x = (int)Days.Sun;
        int y = (int)Days.Fri;
        Console.WriteLine("Sun = {0}", x);
        Console.WriteLine("Fri = {0}", y);
    }
}

1416420cookie-checkSo erhalten Sie den Enum-Indexwert in C#

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy