LINQ & Enums as IQueryable - PullRequest
       29

LINQ & Enums as IQueryable

5 голосов
/ 10 февраля 2010

У меня в основном есть перечисление

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

Ответы [ 4 ]

10 голосов
/ 10 февраля 2010

Вы пытаетесь преобразовать 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) Дополнительные инструкции по именованию перечислений см. В Рекомендации по присвоению имен перечислениям .

2 голосов
/ 10 февраля 2010

Вот не-Linq способ.

РЕДАКТИРОВАТЬ: Это в основном способ Джейсона. Он отправил передо мной. Слава ему.

1 голос
/ 10 февраля 2010

использовать IsDefined текст ссылки

0 голосов
/ 28 марта 2014

Мне удалось преобразовать перечисление в IQueryable, заполнив коллекцию List.

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