2010-02-10 26 views
5

tôi về cơ bản có một enumLINQ & Enums như IQueryable

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

và muốn làm một so sánh với một đầu vào, mà sẽ xảy ra là một chuỗi

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

Điều tốt nhất tôi có thể đến lên với một cái gì đó như thế này

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

Có cách nào tốt hơn để làm điều đó?

Chỉnh sửa: Cảm ơn Aaron & Jason. Nhưng nếu phân tích cú pháp thất bại thì sao?

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

Xem http://msdn.microsoft.com/en-us/library/kxydatf9.aspx cho trường hợp ngoại lệ có thể được ném. – dugas

Trả lời

10

Bạn đang cố gắng chuyển đổi string thành phiên bản WorkingDays? Nếu có sử dụng Enum.Parse:

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

Ở đây chúng ta đang sử dụng quá tải Enum.Parse(Type, string, bool) nơi tham số bool chỉ ra hay không để bỏ qua vụ việc.

Lưu ý phụ, bạn nên đổi tên WorkingDays thành WorkingDay. Nhìn như thế này Khi bạn có một thể hiện của WorkingDay, nói,

WorkingDay day = WorkingDay.Monday; 

lưu ý rằng day là một ngày làm việc (do đó WorkingDay) chứ không phải ngày làm việc (do đó không WorkingDays). Để biết thêm hướng dẫn về cách đặt tên, hãy xem Enumeration Type Naming Guidelines.

2

Here's cách không phải LINQ.

EDIT: Về cơ bản, đó là cách của Jason. Anh ấy đã đăng trước tôi. Tặng kudo cho anh ta.

+0

+1 cho bạn anyways :) – ram

1

sử dụng IsDefined link text

+0

Trên thực tế, sử dụng IsDefined không phải là cách tốt nhất để đi kiểm tra phạm vi như thế này. (Nguyên tắc thiết kế khung, Ed lần 2, trang 181-182). Enum.IsDefined là đắt tiền do có rất nhiều sự phản ánh và nó không đảm bảo luôn mang lại kết quả chính xác cho trang web cuộc gọi. –

0

tôi đã có thể chuyển đổi một enum vào một IQueryable bởi Populating một bộ sưu tập danh sách.

// 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(); 
Các vấn đề liên quan