2010-02-10 97 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(); 

有没有更好的办法做到这一点?

编辑:谢谢亚伦&杰森。但是如果解析失败呢?

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 2010-02-10 02:29:41

回答

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非Linq方式。

编辑:这基本上是杰森的方式。他张贴在我面前。向他颁发荣誉。

+0

+1对你来说:) – ram 2010-02-10 03:45:27

1

使用IsDefined link text

+0

实际上,使用IsDefined并不是进行这种范围检查的最佳方式。 (框架设计指南,第2版,第181-182页)。 Enum.IsDefined由于反思很多,看起来非常昂贵,并且不保证始终为调用网站提供正确的结果。 – 2010-02-10 02:52:13

0

我能够填充一个列表集合到一个枚举转换为IQueryable的。

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