kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 qinking126
qinking126
Вопрос

как проверить, есть ли строковое значение в списке Enum?

В строке запроса у меня есть переменная возраста ?age=New_Born.

Есть ли способ проверить, есть ли это строковое значение New_Born в моем списке Enum.

[Flags]
public enum Age
{
    New_Born = 1,
    Toddler = 2,
    Preschool = 4,
    Kindergarten = 8
}

Сейчас я могу использовать оператор if, но если мой список Enum станет больше. Я хочу найти лучший способ сделать это. Я думаю использовать Linq, но не уверен, как это сделать.

83 2012-05-29T17:45:03+00:00 7
Neil Patrao
Neil Patrao
Редактировал вопрос 25-го октября 2017 в 3:05
Программирование
c#
c#-3.0
c#-4.0
Решение / Ответ
 AaronS
AaronS
29-го мая 2012 в 5:46
2012-05-29T17:46:58+00:00
Дополнительно
Источник
Редактировать
#16306606

Вы можете использовать:

 Enum.IsDefined(typeof(Age), youragevariable)
139
0
Хотите что-то узнать? Задавайте Ваш вопрос на нашем сайте
ru.kzen.dev
John Koerner
John Koerner
29-го мая 2012 в 5:48
2012-05-29T17:48:43+00:00
Дополнительно
Источник
Редактировать
#16306609

Вы можете использовать enum.Метод tryparse:

Age age;
if (Enum.TryParse<Age>("New_Born", out age))
{
    // You now have the value in age 
}
38
0
Хотите что-то узнать? Задавайте Ваш вопрос на нашем сайте
ru.kzen.dev
 Omar
Omar
29-го мая 2012 в 5:48
2012-05-29T17:48:41+00:00
Дополнительно
Источник
Редактировать
#16306608

Вы можете использовать метод TryParse, который в случае успеха возвращает true:

Age age;

if(Enum.TryParse<Age>("myString", out age))
{
   //Here you can use age
}
 Omar
Omar
Редактировал ответ 29-го мая 2012 в 6:00
9
0
 jwsadler
jwsadler
13-го апреля 2017 в 10:45
2017-04-13T22:45:39+00:00
Дополнительно
Источник
Редактировать
#16306611

Я знаю, что это старый нить, но здесь'ы немного другой подход, используя атрибуты перечисляет и затем вспомогательный класс, чтобы найти перечислить, что соответствует.

Таким образом, вы могли бы иметь несколько отображений на одном перечислить.

public enum Age
{
    [Metadata("Value", "New_Born")]
    [Metadata("Value", "NewBorn")]
    New_Born = 1,
    [Metadata("Value", "Toddler")]
    Toddler = 2,
    [Metadata("Value", "Preschool")]
    Preschool = 4,
    [Metadata("Value", "Kindergarten")]
    Kindergarten = 8
}

Мой вспомогательный класс, как это

public static class MetadataHelper
{
    public static string GetFirstValueFromMetaDataAttribute<T>(this T value, string metaDataDescription)
    {
        return GetValueFromMetaDataAttribute(value, metaDataDescription).FirstOrDefault();
    }

    private static IEnumerable<string> GetValueFromMetaDataAttribute<T>(T value, string metaDataDescription)
    {
        var attribs =
            value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof (MetadataAttribute), true);
        return attribs.Any()
            ? (from p in (MetadataAttribute[]) attribs
                where p.Description.ToLower() == metaDataDescription.ToLower()
                select p.MetaData).ToList()
            : new List<string>();
    }

    public static List<T> GetEnumeratesByMetaData<T>(string metadataDescription, string value)
    {
        return
            typeof (T).GetEnumValues().Cast<T>().Where(
                enumerate =>
                    GetValueFromMetaDataAttribute(enumerate, metadataDescription).Any(
                        p => p.ToLower() == value.ToLower())).ToList();
    }

    public static List<T> GetNotEnumeratesByMetaData<T>(string metadataDescription, string value)
    {
        return
            typeof (T).GetEnumValues().Cast<T>().Where(
                enumerate =>
                    GetValueFromMetaDataAttribute(enumerate, metadataDescription).All(
                        p => p.ToLower() != value.ToLower())).ToList();
    }

}

затем вы можете сделать что-то подобное

var enumerates = MetadataHelper.GetEnumeratesByMetaData<Age>("Value", "New_Born");

И для полноты картины вот атрибут:

 [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = true)]
public class MetadataAttribute : Attribute
{
    public MetadataAttribute(string description, string metaData = "")
    {
        Description = description;
        MetaData = metaData;
    }

    public string Description { get; set; }
    public string MetaData { get; set; }
}
1
0
Хотите что-то узнать? Задавайте Ваш вопрос на нашем сайте
ru.kzen.dev
 Andy
Andy
12-го апреля 2018 в 9:20
2018-04-12T09:20:54+00:00
Дополнительно
Источник
Редактировать
#16306612

Я've получили удобный метод расширения, который использует метод tryparse, как определен с учетом регистра.

public static bool IsParsable<T>(this string value) where T : struct
{
    return Enum.TryParse<T>(value, true, out _);
}
1
0
 agent-j
agent-j
29-го мая 2012 в 5:47
2012-05-29T17:47:23+00:00
Дополнительно
Источник
Редактировать
#16306607

Чтобы разобрать возраст:

Age age;
if (Enum.TryParse(typeof(Age), "New_Born", out age))
  MessageBox.Show("Defined");  // Defined for "New_Born, 1, 4 , 8, 12"

Проверить, определен ли он:

if (Enum.IsDefined(typeof(Age), "New_Born"))
   MessageBox.Show("Defined");

В зависимости от того, как вы планируете использовать перечисление Age, флаги могут оказаться не тем, что нужно. Как вы, вероятно, знаете, [Flags] указывает на то, что вы хотите разрешить несколько значений (как в битовой маске). IsDefined вернет false для Age.Toddler | Age.Preschool, потому что у него несколько значений.

 agent-j
agent-j
Редактировал ответ 29-го мая 2012 в 5:56
0
0
Хотите что-то узнать? Задавайте Ваш вопрос на нашем сайте
ru.kzen.dev
Viacheslav Smityukh
Viacheslav Smityukh
29-го мая 2012 в 5:52
2012-05-29T17:52:24+00:00
Дополнительно
Источник
Редактировать
#16306610

Вы должны использовать перечислимый.Метод tryparse, чтобы достичь своей цели

Это пример:

[Flags]
private enum TestEnum
{
    Value1 = 1,
    Value2 = 2
}

static void Main(string[] args)
{
    var enumName = "Value1";
    TestEnum enumValue;

    if (!TestEnum.TryParse(enumName, out enumValue))
    {
        throw new Exception("Wrong enum value");
    }

    // enumValue contains parsed value
}
0
0
Похожие сообщества 6
Microsoft Stack Jobs
Microsoft Stack Jobs
2 400 пользователей
Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks
Открыть telegram
С#
С#
2 329 пользователей
Стараемся не флудить. Пишем по делу. Правила: https://t.me/professorweb/430450 Для флуда @svoboda_obsh
Открыть telegram
CODE BLOG / C#
CODE BLOG / C#
1 765 пользователей
Чат для .NET разработчиков и C# программистов. По всем вопросам: @shwanoff Youtube-канал: https://youtube.com/codeblog Основной канал: @codeblog Вконтакте: https://vk.com/codeblog Правила: https://t.me/codeblog_csharp/246972 Вакансии по тегу #work
Открыть telegram
var chat = new Chat();
var chat = new Chat();
1 626 пользователей
Обсуждение .NET / C# / F# Обсуждение Azure — @azurechat Прочие обсуждения – https://t.me/+zwxI91RGG6s2YzAy
Открыть telegram
C#/.NET Для Новичков
C#/.NET Для Новичков
294 пользователей
Группа создана для тех, кто изучает язык программирования C#. Верховный главнокомандующий: @BlackDeveloper Оффтоп - разрешен в меру, реклама - бан.
Открыть telegram
ext
ext
64 пользователей
Общение на темы YouTube канала и программирования. Вакансии не размещаем. Основной канал: @extremecode
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Александр Македонский
Зарегистрирован 6 дней назад
2
Andrei Kalinin
Зарегистрирован 3 недели назад
3
Koroleva Ego
Зарегистрирован 1 месяц назад
4
Star Lenon
Зарегистрирован 1 месяц назад
5
Данил Жевнеров
Зарегистрирован 2 месяца назад
Хотите что-то узнать? Задавайте Ваш вопрос на нашем сайте
ru.kzen.dev
ID
JA
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией