2010-02-10 18 views
5

Tengo básicamente una enumeraciónLINQ y enumeraciones como IQueryable

public enum WorkingDays 
    { 
     Monday, Tuesday, Wednesday, Thursday, Friday 
    } 

y me gustaría hacer una comparación con una entrada, que pasa a ser una cadena

//note lower case 
string input = "monday"; 

Lo mejor que podía venir con algo como esto

WorkingDays day = (from d in Enum.GetValues(typeof(WorkingDays)).Cast<WorkingDays>() 
           where d.ToString().ToLowerInvariant() == input.ToLowerInvariant() 
           select d).FirstOrDefault(); 

¿Hay alguna forma mejor de hacerlo?

Editar: Gracias Aaron & Jason. Pero, ¿y si el análisis falla?

if(Enum.IsDefined(typeof(WorkingDay),input))//cannot compare if case is different 
      { 
       WorkingDay day = (WorkingDay)Enum.Parse(typeof(WorkingDay), input, true); 
       Console.WriteLine(day); 
      } 
+0

Ver http://msdn.microsoft.com/en-us/library/kxydatf9.aspx para las excepciones que pueden ser lanzadas. – dugas

Respuesta

10

¿Estás tratando de convertir un string a una instancia de WorkingDays? Si es así utilizar Enum.Parse:

WorkingDays day = (WorkingDays)Enum.Parse(typeof(WorkingDays), "monday", true); 

Aquí estamos usando la sobrecarga Enum.Parse(Type, string, bool) donde el parámetro bool indica si o no hacer caso omiso de caso.

En una nota lateral, debe cambiar el nombre WorkingDays a WorkingDay. Mira esto. Cuando usted tiene una instancia de WorkingDay, por ejemplo,

WorkingDay day = WorkingDay.Monday; 

nota que day es un día de trabajo (por lo tanto WorkingDay) y no en días de trabajo (por lo tanto no WorkingDays). Para obtener instrucciones adicionales sobre el nombramiento de enumeraciones, consulte Enumeration Type Naming Guidelines.

2

Here's una forma diferente de Linq.

EDITAR: Básicamente es la forma de Jason. Él publicó antes que yo. Dale las felicitaciones.

+0

+1 para usted de todos modos :) – ram

1

uso IsDefined link text

+0

En realidad, el uso de IsDefined no es la mejor manera de hacer controles de rango como este. (Framework Design Guidelines, 2nd Ed., Pp 181-182). Enum.IsDefined es engañosamente caro debido a la gran cantidad de reflejos y no se garantiza que siempre proporcione los resultados correctos para el sitio de llamadas. –

0

yo era capaz de convertir una enumeración en un IQueryable poblando una colección de listas.

// Create list to hold enum values 
List<string> WorkingDaysList = new List<string>(); 

// loop thru enum values and store in List 
foreach (var value in Enum.GetValues(typeof(WorkingDays))) 
{ 
    var _WorkingDaysList = ((WorkingDays)value).ToString(); 
    WorkingDaysList.Add(_WorkingDaysList); 
} 
// use linq to query list  
var result = (from d in WorkingDaysList where d.ToLower() == input.ToLower() select d).FirstOrDefault(); 
Cuestiones relacionadas