如何在忽略 c# 的情况下检查枚举值中的 "Contains"?

How to check "Contains" in enum values with ignoring case c#?

我需要使用 Contains.

检查枚举中是否存在字符串值
public enum Days
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 3,
    Thursday = 4,
    Friday = 5,
    Saturday = 6,
    Sunday = 7
}

public class ResultObj
{
   public int Id { get; set; }
   public string Name { get; set; }
}

var filter = "Wed";
var dayList = Enum.GetValues(typeof(Days))
               .Cast<Days>()
               .Where(x => Enum.IsDefined(typeof(Days), filter))
               .Select(d => new ResultObj
               {
                   Id = (int)d,
                   Name = d.ToString()
               }).ToList();

如果给定 "Wed" 意味着,我需要一个 dayList 结果作为 { Id = 3, Name = Wednesday }

如果给定过滤器 "Wednesday" 意味着,我需要一个 dayList 结果作为 { Id = 3, Name = Wednesday }

如果给定过滤器 "wednesday" 意味着,我需要一个 dayList 结果作为 { Id = 3, Name = Wednesday }

如果给定过滤器 "dnes" 意味着,我需要一个 dayList 结果作为 { Id = 3, Name = Wednesday }

如果按照 "xyx" 的方式给定过滤器,dayList 计数应该为零。

您可以使用 Where 子句,例如:

.Where(x => Enum.GetName(typeof(Days), x).ContainsCaseInsenitive(filter))

其中 ContainsCaseInsensitive 是字符串的扩展方法:

// adapted from: 
public static bool ContainsCaseInsensitive(this string a, string b) =>
    CultureInfo.InvariantCulture.CompareInfo.IndexOf(a, b, CompareOptions.IgnoreCase) >= 0;

您可以稍微重写您的 Linq 方法链,select 来自 Enum 值数组的字符串值,并检查 Enum 名称是否包含过滤器(不区分大小写)。然后 select 一个 ResultObj 并将 Enum 值转换回

 var filter = "Wed";
 var dayList = Enum.GetValues(typeof(Days))
     .Cast<Days>()
     .Select(x => x.ToString())
     .Where(x => x.Contains(filter, StringComparison.OrdinalIgnoreCase))
     .Select(d => new ResultObj
     {
         Id = (int)Enum.Parse(typeof(Days), d),
         Name = d
     }).ToList();