2011-03-16 16 views
23

Tengo una pregunta bastante básica: ¿Cómo puedo comprobar si un valor dado está contenida en una lista de valores de enumeración?valor está en la lista de enumeración

Por ejemplo, tengo esta enumeración:

public enum UserStatus 
{ 
    Unverified, 
    Active, 
    Removed, 
    Suspended, 
    Banned 
} 

Ahora quiero comprobar si status in (Unverified, Active)

Sé que esto funciona:

bool ok = status == UserStatus.Unverified || status == UserStatus.Active; 

Pero tiene que haber una manera más elegante forma de escribir esto.

El tema de this queston es muy similar, pero que está tratando con banderas enumeraciones, y esto no es una enumeración banderas.

Gracias de antemano.

+0

¿Cuál es el tipo de datos de la variable de estado? – Lav

Respuesta

51

Aquí es un método de extensión que ayuda mucho en muchas circunstancias.

public static class Ext 
{ 
    public static bool In<T>(this T val, params T[] values) where T : struct 
    { 
     return values.Contains(val); 
    } 
} 

Uso:

Console.WriteLine(1.In(2, 1, 3)); 
Console.WriteLine(1.In(2, 3)); 
Console.WriteLine(UserStatus.Active.In(UserStatus.Removed, UserStatus.Banned)); 
+0

+1 Me gusta su solución –

+0

Sí, esto es exactamente lo que estaba buscando. De nuevo, no estoy seguro de por qué esto no está incorporado, pero al menos es posible. :) ¡Gracias! –

+0

¡Este es un enfoque muy agradable! –

22

Si se trata de una lista más larga de las enumeraciones, puede utilizar:

var allowed = new List<UserStatus> { UserStatus.Unverified, UserStatus.Active }; 
bool ok = allowed.Contains(status); 

De lo contrario no hay forma de evitar la larga || predicado, la comprobación de cada valor permitido.

1

por qué no crear un método para encapsular ella?

public bool UnVerifiedOrActive(User user) 
{ 
    return (user.UserStatus == UserStatus.Unverified || 
      user.UserStatus == UserStatus.Active); 
} 
+0

O usted podría convertirlo en un método de extensión dentro de una clase estática ... –

+0

Gracias, pero esto no es realmente una cuestión de DRY, sólo más concisa sobre el código. Todavía no estoy seguro de por qué C# no tiene algún tipo de operador 'in' que pueda usarse en casos como este. –

0

Puede seguir los siguientes pasos

UserStatus ustatus; 
if(Enum.TryParse<UserStatus>(c.ToString(), out ustatus)) 
{ 
..Your logic 
} 
1
UserStatus userStatus = null; 
Eum.TryParse<UserStatus>(status.ToString(), out userStatus); 

if(userStatus != null) 
{ 
    //it is not in the list 
} 
+0

No creo que esto va a funcionar, ya que está comprobando contra todos los valores de la enumeración, en lugar de un subconjunto de valores (si estoy leyendo correctamente). –

+0

@Jerad esto funciona. darle una oportunidad. Tengo la misma solución que 'Lav' publicada –

+0

@Avian - pero, ¿dónde se verifican solo los valores no verificados o activos (frente a los otros tres valores)? –

6

Uso Enum.IsDefined

ejemplo:

public enum enStage {Work, Payment, Record, Return, Reject}; 
int StageValue = 4; 

Enum.IsDefined(typeof(enStage), StageValue) 
Cuestiones relacionadas