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 5

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