Saltar al contenido

Cómo obtener el valor de enumeración siguiente (o anterior) en C#

Después de investigar en diferentes repositorios y sitios webs al final dimos con la solución que te compartimos aquí.

Solución:

Gracias a todos por sus respuestas y comentarios. Me sorprendió recibir tantos de ellos. Mirándolos y usando algunas de las ideas, se me ocurrió esta solución, que funciona mejor para mí:

public static class Extensions


    public static T Next(this T src) where T : struct
    
        if (!typeof(T).IsEnum) throw new ArgumentException(String.Format("Argument 0 is not an Enum", typeof(T).FullName));

        T[] Arr = (T[])Enum.GetValues(src.GetType());
        int j = Array.IndexOf(Arr, src) + 1;
        return (Arr.Length==j) ? Arr[0] : Arr[j];            
    

La belleza de este enfoque, que es simple y universal de usar. Implementado como método de extensión genérico, puede llamarlo en cualquier enumeración de esta manera:

return eRat.B.Next();

Tenga en cuenta que estoy usando un método de extensión generalizado, por lo que no necesito especificar el tipo en la llamada, solo .Next().

Probablemente un poco exagerado, pero:

eRat value = eRat.B;
eRat nextValue = Enum.GetValues(typeof(eRat)).Cast()
        .SkipWhile(e => e != value).Skip(1).First();

o si quieres el primero que sea numéricamente más grande:

eRat nextValue = Enum.GetValues(typeof(eRat)).Cast()
        .First(e => (int)e > (int)value);

o para el siguiente más grande numéricamente (haciendo la clasificación nosotros mismos):

eRat nextValue = Enum.GetValues(typeof(eRat)).Cast()
        .Where(e => (int)e > (int)value).OrderBy(e => e).First();

Oye, con LINQ como tu martillo, el mundo está lleno de clavos ;-p

Vos si De Verdad ¿Necesitas generalizar este problema? ¿Puedes hacer esto en su lugar?

public void SomeMethod(MyEnum myEnum)

    MyEnum? nextMyEnum = myEnum.Next();

    if (nextMyEnum.HasValue)
    
        ...
    


public static MyEnum? Next(this MyEnum myEnum)

    switch (myEnum)
    
        case MyEnum.A:
            return MyEnum.B;
        case MyEnum.B:
            return MyEnum.C;
        case MyEnum.C:
            return MyEnum.D;
        default:
            return null;
    

Sección de Reseñas y Valoraciones

Nos puedes añadir valor a nuestro contenido informacional asistiendo con tu experiencia en las notas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *