I basically have an enum
public enum WorkingDays
{
Monday, Tuesday, Wednesday, Thursday, Friday
}
and would like to do a comparison against an input, which happens to be a string
//note lower case
string input = "monday";
The best thing I could come up with was something like this
WorkingDays day = (from d in Enum.GetValues(typeof(WorkingDays)).Cast<WorkingDays>()
where d.ToString().ToLowerInvariant() == input.ToLowerInvariant()
se开发者_高级运维lect d).FirstOrDefault();
Is there any better way to do it ?
Edit: Thanks Aaron & Jason. But what if the parse fails ?
if(Enum.IsDefined(typeof(WorkingDay),input))//cannot compare if case is different
{
WorkingDay day = (WorkingDay)Enum.Parse(typeof(WorkingDay), input, true);
Console.WriteLine(day);
}
Are you trying to convert a string
to an instance of WorkingDays
? If so use Enum.Parse
:
WorkingDays day = (WorkingDays)Enum.Parse(typeof(WorkingDays), "monday", true);
Here we are using the overload Enum.Parse(Type, string, bool)
where the bool
parameter indicates whether or not to ignore case.
On a side note, you should rename WorkingDays
to WorkingDay
. Look at like this. When you have an instance of WorkingDay
, say,
WorkingDay day = WorkingDay.Monday;
note that day
is a working day (thus WorkingDay
) and not working days (thus not WorkingDays
). For additional guidelines on naming enumerations, see Enumeration Type Naming Guidelines.
Here's a non-Linq way.
EDIT: It's basically Jason's way. He posted before me. Give the kudos to him.
use IsDefined link text
I was able to convert an enum into a IQueryable by populating a List collection.
// 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();
精彩评论