【问题标题】:LINQ & Enums as IQueryableLINQ 和枚举作为 IQueryable
【发布时间】:2010-02-10 02:09:32
【问题描述】:

我基本上有一个枚举

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

【问题讨论】:

标签: c# .net linq enums iqueryable


【解决方案1】:

您是否尝试将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)。有关命名枚举的其他指南,请参阅Enumeration Type Naming Guidelines

【讨论】:

    【解决方案2】:

    Here's 一种非 Linq 方式。

    编辑:这基本上是 Jason 的方式。他在我面前张贴。给他点个赞吧。

    【讨论】:

      【解决方案3】:

      使用 IsDefined link text

      【讨论】:

      • 实际上,使用 IsDefined 并不是进行此类范围检查的最佳方式。 (框架设计指南,第 2 版,第 181-182 页)。由于大量反射,Enum.IsDefined 看似昂贵,并且不能保证始终为调用站点产生正确的结果。
      【解决方案4】:

      我能够通过填充 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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-11
        • 2012-09-22
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        • 2023-03-16
        • 1970-01-01
        相关资源
        最近更新 更多