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();
Есть какой-нибудь лучший способ сделать это ?
Edit: Спасибо 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);
}
4 ответа:
Вы пытаетесь преобразовать
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
). Для получения дополнительной информации о наименовании перечисления, см.указания по именованию типов перечислений .
Вот не-Linq способ.
EDIT: это в основном путь Джейсона. Он написал передо мной. Отдайте ему должное.
Используйте Определен Текст ссылки
Я смог преобразовать перечисление в 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();