Cómo obtener el valor del índice Enum en C#

5 minutos de lectura

Cía, enums, internamente equivale a un número entero. Por lo tanto podemos tratar tipos de datos de enum como entero también.

¿Cómo lograr lo mismo con C#?

  • duplicado: stackoverflow.com/questions/29482/cast-int-to-enum-in-c (ah, y enum to int es solo un lanzamiento como otra respuesta)

    – Dmitri

    2 de junio de 2011 a las 10:47


  • @Dmitry: Parece que la otra publicación es en realidad al revés 🙂

    – Shamim Hafiz – MSFT

    2 de junio de 2011 a las 11:12

avatar de usuario
sala de iain

En primer lugar, podría haber dos valores a los que te refieres:

Valor subyacente

Si está preguntando sobre el valor subyacente, que podría ser cualquiera de estos tipos: byte, sbyte, short, ushort, int, uint, long o ulong

Luego, simplemente puede convertirlo en su tipo subyacente. Suponiendo que es un intpuedes hacerlo así:

int eValue = (int)enumValue;

Sin embargo, también tenga en cuenta el valor predeterminado de cada elemento (el primer elemento es 0, el segundo es 1 y así sucesivamente) y el hecho de que a cada elemento se le podría haber asignado un nuevo valor, que puede no estar necesariamente en un orden particular. (Crédito a @JohnStock por el toque para aclarar).

Este ejemplo asigna a cada uno un nuevo valor y muestra el valor devuelto:

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

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

Valor de índice

El anterior es generalmente el valor requerido más comúnmente, y es lo que su pregunta sugiere que necesita, sin embargo, cada valor también tiene un valor de índice (al que se refiere en el título). Si necesita esto, consulte otras respuestas a continuación para obtener más detalles.

  • El valor int no es necesariamente el índice como se muestra en la respuesta del usuario 1027167 a continuación. Pensándolo bien, no creo que esté claro si OP realmente quiere el índice o el valor int …

    – Svend Hansen

    5 sep 2019 a las 14:41


  • Esta respuesta es incorrecta y hace grandes suposiciones sobre su enumeración para que funcione.

    – Juan Stock

    9 oct 2020 a las 20:36

  • @JohnStock Lo siento, ¿de qué manera está mal? ¿Puede por favor elaborar? Tenga en cuenta que fue escrito hace casi 10 años, y fue escrito en respuesta a alguien que aparentemente quería una respuesta simple a una pregunta simple, así que sí, se hicieron suposiciones y obviamente, como siempre, puede ser más complicado pero parece han satisfecho lo que buscaban!

    – Iain Ward

    10 oct 2020 a las 22:51

  • OP está pidiendo un índice. Su respuesta asume que una enumeración tiene un conjunto consistente de valores incrementales consecutivos como 1, 2, 3, 4, 5, lo que, por supuesto, muy a menudo no es cierto con las enumeraciones. Podría ser en orden inverso, no valores consecutivos, aparentemente aleatorios o incluso no numéricos en absoluto. Debe eliminar su respuesta porque solo funciona para un caso de uso muy específico y causará errores en otros casos. Si lee las otras respuestas en esta página, este error en su solución (y en otras personas) se ha señalado en numerosas ocasiones. Nada ha cambiado en 10 años.

    – Juan Stock

    12 oct 2020 a las 15:44

  • @JohnStock ¡Ah, ya veo! Está bien, entiendo lo que estás diciendo, pero para ser honesto, todo se reduce a tu interpretación si lo que él está preguntando. Aunque dice ‘Índice’ en el título (y admito que me lo perdí), su pregunta real sobre las enumeraciones que equivalen a un número entero sugiere, y creo que en la mayoría de las situaciones, se refiere al valor subyacente de la enumeración, y no específicamente el valor del índice en sí. ¡No puedo pensar en una situación en la que alguna vez haya necesitado el valor del índice! (¿Hay alguno?) así que sí, hice una suposición allí y sigo creyendo que fue la decisión correcta ya que él la aceptó.

    – Iain Ward

    13 oct 2020 a las 20:03

Otra forma de convertir un Enum-Type a un int:

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
}

Más complejo pero independiente de los valores INT asignados a los valores enumerados.

  • Esta es una mejor respuesta que la aceptada (o las muchas otras respuestas similares) ya que todas parecen asumir que sus valores de enumeración se asignan con valores numéricos secuenciales y, a menudo, ese no es el caso.

    – Christopher King

    6 de diciembre de 2017 a las 0:46

  • ¡¡¡¡Monstruo!!!! Buena respuesta. ¡Funcionó perfectamente en un método con generalización de Enum Type! Gracias

    – Bada

    2 de diciembre de 2019 a las 12:11

  • Tenga cuidado al usar banderas, el índice se calcula por el valor ordenado numéricamente de la bandera, y no por el orden en que se definen. En el ejemplo anterior, si define A=1,C=4, B=2, entonces B todavía tiene un índice de 1, aunque se definió después de C. Esto puede causar resultados inesperados cuando se usan indicadores compuestos. Nuevamente, en el ejemplo anterior, si agregamos una nueva bandera “AB = A | B’, entonces su valor será 3, y el índice de C cambiará de 2 en el ejemplo anterior a 3, ya que “AB’ está ubicado entre B y C en orden de índice.

    – Jimbob El Marinero

    15 de septiembre de 2020 a las 5:10


De forma predeterminada, el tipo subyacente de cada elemento de la enumeración es entero.

enum Values
{
   A,
   B,
   C
}

También puede especificar un valor personalizado para cada artículo:

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

Nota: Por defecto, el primer enumerador tiene el valor 0.

  • ¿Qué pasa con el valor del segundo enumerador? es 1?

    – Fuat

    30 de enero de 2019 a las 13:44

avatar de usuario
Durgesh Pandey

Puedes lanzarlo directamente:

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();
}

Por ejemplo:

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

Utilice fundición simple:

int value = (int) enum.item;

Referirse a enumeración (referencia de C#)

avatar de usuario
pulgarcitos

Usa un yeso:

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


int val = (int)MyEnum.A;

avatar de usuario
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);
    }
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad