LINQ和枚举类型作为IQueryable

5

我基本上有一个枚举

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

有更好的方法吗?

编辑:谢谢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);
            }

请参阅 http://msdn.microsoft.com/zh-cn/library/kxydatf9.aspx 以了解可能引发的异常。 - dugas
4个回答

10

您是否想将一个 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
这里提供一种非Linq的方法。
编辑:基本上是Jason的方法。他比我先发了帖子。把赞给他。

1

实际上,像这样的范围检查使用IsDefined并不是最好的方法。(框架设计准则,第二版,181-182页)。由于涉及大量反射操作,Enum.IsDefined的性能会被误导,并且不能保证始终为调用方提供正确的结果。 - Scott Dorman

0
我通过填充一个List集合,成功将枚举类型转换为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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接