2010-02-10 3 views
5

Я в принципе есть перечислениеLINQ & Перечисления в IQueryable

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

и хотел бы сделать сравнение с входом, который случается быть строкой

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

Самое лучшее, что я мог бы прийти с чем-то вроде этого

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

Есть ли лучший способ сделать это?

Редактировать: Thanks Aaron & Jason. Но что, если разбор не сработает?

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

См http://msdn.microsoft.com/en-us/library/kxydatf9.aspx для исключений, которые могут быть выброшены. – dugas

ответ

10

Вы пытаетесь преобразовать string к экземпляру WorkingDays? Если так использовать Enum.Parse:

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

Здесь мы используем перегрузку Enum.Parse(Type, string, bool) где параметр bool указывает, следует ли игнорировать регистр.

На боковой ноте следует переименовать WorkingDays в WorkingDay. Посмотрите так. Если у вас есть экземпляр WorkingDay, скажем,

WorkingDay day = WorkingDay.Monday; 

сведению, что day является рабочий день (при этом WorkingDay), а не рабочих дней (при этом не WorkingDays). Дополнительные указания по перечислениям имен указаны в разделе Enumeration Type Naming Guidelines.

2

Here's a non-Linq way.

EDIT: Это в основном способ Джейсона. Он отправил передо мной. Дайте ему славу.

+0

+1 для вас в любом случае :) – ram

1

использование IsDefined link text

+0

Собственно, использование IsDefined - это не лучший способ пройти проверку диапазона, как это. (Руководство по разработке рамок, 2-е изд., Стр. 181-182). Enum.IsDefined обманчиво дорог из-за большого количества размышлений, и не гарантируется, что он всегда дает правильные результаты для сайта вызова. –

0

Я был в состоянии преобразовать перечисление в IQueryable путем заполнения коллекции 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(); 
Смежные вопросы