代码之家  ›  专栏  ›  技术社区  ›  ram

可查询的Linq和Enums

  •  5
  • ram  · 技术社区  · 15 年前

    我基本上有一个枚举

    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);
                }
    
    4 回复  |  直到 11 年前
        1
  •  10
  •   jason    15 年前

    你想转换一个 string 到的一个实例 WorkingDays ?如果如此使用 Enum.Parse :

    WorkingDays day = (WorkingDays)Enum.Parse(typeof(WorkingDays), "monday", true);
    

    这里我们用的是超负荷 Enum.Parse(Type, string, bool) 何处 bool 参数指示是否忽略大小写。

    在旁注中,您应该重命名 工作日 WorkingDay . 像这样看。当你有一个 工作日 比如说

    WorkingDay day = WorkingDay.Monday;
    

    注意 day 是工作日(因此 工作日 )不是工作日(因此不是 工作日 )有关命名枚举的其他准则,请参见 Enumeration Type Naming Guidelines .

        2
  •  2
  •   Aaron Daniels    15 年前

    Here's 非LINQ方式。

    编辑:基本上是杰森的方式。他在我面前发帖。向他致敬。

        3
  •  1
  •   Cheung    15 年前

    使用定义 link text

        4
  •  0
  •   Barry MSIH    11 年前

    通过填充列表集合,我能够将枚举转换为可查询的。

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