c# - ¿Cómo realizar una consulta LINQ sobre Enum?




.net data-binding (4)

"... solo muestra los primeros 4 estados e ignora el resto".

Para obtener los primeros n elementos de un IEnumerable<T> , use el método Take :

return Enum.GetValues(typeof(Activity.StatusEnum))
    .Cast<Activity.StatusEnum>()
    .Take(4)
    .ToList();

A continuación está mi Enumerator List :

public enum StatusEnum
{
    Open = 1,
    Rejected = 2,
    Accepted = 3,
    Started = 4,
    Completed = 5,
    Cancelled = 6,
    Assigned = 7
}

Necesito vincular esto a un Combobox , pero solo mostrar unos pocos estados específicos e ignorar el resto.

Esto es lo que tengo hasta ahora:

public static List<Activity.StatusEnum> StatusList()
{
        IEnumerable<Activity.StatusEnum> query = Enum.GetValues(typeof(Activity.StatusEnum)).Cast<Activity.StatusEnum>()
                        .Where(x => x == Activity.StatusEnum.Open
                            || x == Activity.StatusEnum.Rejected
                            || x == Activity.StatusEnum.Accepted
                            || x == Activity.StatusEnum.Started);
        return query.ToList();
}

Sin embargo, creo que el código es un poco desordenado y no es un enfoque correcto para vincular la lista Enum filtrada a un Combobox . ¿Alguien puede sugerir una forma más robusta de hacer esto?

Actualizar

Podría necesitar cambiar el orden de selección. Entonces necesito una solución genérica que no solo obtenga el primer número X de estados.


¿Qué tal algo así como:

.Where(x => x <= Activity.StatusEnum.Started)

Primero, si es posible, haré que tu enum calcule potencias de 2, para que puedan ser OR juntas.

public enum StatusEnum
{
    Open = 1,
    Rejected = 2,
    Accepted = 4,
    Started = 8,
    Completed = 16,
    Cancelled = 32,
    Assigned = 64
}

Entonces podrías hacer algo como esto:

public static List<Activity.StatusEnum> StatusList()
{
    var statusesToShow = Activity.StatusEnum.Open | Activity.StatusEnum.Rejected | Activity.StatusEnum.Accepted | Activity.StatusEnum.Started;

    return Enum
        .GetValues(typeof(Activity.StatusEnum))
        .Cast<Activity.StatusEnum>()
        .Where(x => (x & statusesToShow) == x)
        .ToList();
}

EDITAR : A la luz del hecho de que no puedes cambiar los valores enum, te recomendaría que uses algo como:

public static List<Activity.StatusEnum> StatusList()
{
    return new List<Activity.StatusEnum> {
        Activity.StatusEnum.Open, 
        Activity.StatusEnum.Rejected, 
        Activity.StatusEnum.Accepted, 
        Activity.StatusEnum.Started
    };
}

Pasos:

  • Obtenga los valores enum y eche los resultados al tipo de enum
  • Ordene los valores enum por sus valores enteros (de lo contrario, ordenan naturalmente por magnitud sin signo)
  • Toma los primeros 4

Código:

return Enum.GetValues(typeof(Activity.StatusEnum))
.Cast<Activity.StatusEnum>()
.OrderBy(se =>(int)se)
.Take(4);

Salida:

Abierto Rechazado Aceptado Comenzó







enums