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