Как проверить «Содержит» в перечислении значения без учета регистра c#? - PullRequest
2 голосов
/ 20 апреля 2020

Мне нужно проверить строковые значения, присутствующие в Enum или не использующие 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 }.

Если данный фильтр означает «среда», мне нужен результат dayList как { Id = 3, Name = Wednesday }.

Если данный фильтр означает «среда», мне нужен результат dayList как { Id = 3, Name = Wednesday }.

Если указанный фильтр означает «dnes», мне нужен результат dayList как { Id = 3, Name = Wednesday }.

Если данный фильтр означает «xyx», счетчик dayList должен быть равен нулю.

Ответы [ 2 ]

5 голосов
/ 20 апреля 2020

Вы можете использовать предложение Where, например:

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

, где ContainsCaseInsensitive - метод расширения строки:

// adapted from: https://stackoverflow.com/a/15464440/5133585
public static bool ContainsCaseInsensitive(this string a, string b) =>
    CultureInfo.InvariantCulture.CompareInfo.IndexOf(a, b, CompareOptions.IgnoreCase) >= 0;
1 голос
/ 20 апреля 2020

Вы можете немного переписать вашу цепочку методов Linq, выбрать строковые значения из массива значений enum и проверить, что имя enum содержит фильтр (с игнорированием регистра). Затем выберите 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();
...