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#?
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#?
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 int
das 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
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.
Daumenmücken
Verwenden Sie eine Besetzung:
public enum MyEnum : int {
A = 0,
B = 1,
AB = 2,
}
int val = (int)MyEnum.A;
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);
}
}
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