2010-02-10 16 views
5

io fondamentalmente ho un enumLINQ & enumerazioni come IQueryable

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

e vorrei fare un confronto contro un ingresso, che risulta essere una stringa

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

La cosa migliore che potevo venire con era qualcosa di simile

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

C'è un modo migliore per farlo?

Modifica: Grazie Aaron & Jason. Ma cosa succede se l'analisi fallisce?

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

Vedi http://msdn.microsoft.com/en-us/library/kxydatf9.aspx per le eccezioni che possono essere lanciate. – dugas

risposta

10

Stai cercando di convertire un string a un'istanza di WorkingDays? Se è così utilizzare Enum.Parse:

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

Qui stiamo usando il sovraccarico Enum.Parse(Type, string, bool) dove il parametro bool indica se ignorare caso.

Nota a margine, è necessario rinominare WorkingDays in WorkingDay. Guarda come questo. Quando si dispone di un'istanza di WorkingDay, diciamo,

WorkingDay day = WorkingDay.Monday; 

nota che day è una giornata di lavoro (quindi WorkingDay) e non giorni lavorativi (quindi non WorkingDays). Per ulteriori linee guida sulla denominazione delle enumerazioni, vedere Enumeration Type Naming Guidelines.

2

Here's un modo non Linq.

EDIT: È fondamentalmente il modo di Jason. Ha pubblicato prima di me. Dagli il plauso a lui.

+0

+1 per te comunque :) – ram

1

uso TestDefinito link text

+0

In realtà, l'utilizzo di IsDefined non è il modo migliore per effettuare controlli di intervallo come questo. (Framework Design Guidelines, 2nd Ed., Pp 181-182). Enum.IsDefined è ingannevolmente costoso a causa di un sacco di riflessione e non è garantito per sempre fornire i risultati corretti per il sito di chiamata. –

0

sono stato in grado di convertire un enum in un IQueryable popolando una raccolta List.

// 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(); 
Problemi correlati