Значение в списке enum - PullRequest
28 голосов
/ 16 марта 2011

У меня есть довольно простой вопрос: как я могу проверить, содержится ли данное значение в списке значений перечисления?

Например, у меня есть это перечисление:

public enum UserStatus
{
    Unverified,
    Active,
    Removed,
    Suspended,
    Banned
}

Теперь я хочу проверить, если status in (Unverified, Active)

Я знаю, что это работает:

bool ok = status == UserStatus.Unverified || status == UserStatus.Active;

Но должен быть более элегантный способ написать это.

Темаиз этот вопрос очень похож, но он имеет дело с перечислениями flags, и это не перечисление flags.

Ответы [ 6 ]

66 голосов
/ 16 марта 2011

Вот метод расширения, который очень помогает во многих обстоятельствах.

public static class Ext
{
    public static bool In<T>(this T val, params T[] values) where T : struct
    {
        return values.Contains(val);
    }
}

Использование:

Console.WriteLine(1.In(2, 1, 3));
Console.WriteLine(1.In(2, 3));
Console.WriteLine(UserStatus.Active.In(UserStatus.Removed, UserStatus.Banned));
23 голосов
/ 16 марта 2011

Если это более длинный список перечислений, вы можете использовать:

var allowed = new List<UserStatus> { UserStatus.Unverified, UserStatus.Active };
bool ok = allowed.Contains(status);

В противном случае невозможно обойти длинный предикат ||, проверяя каждое допустимое значение.

6 голосов
/ 20 сентября 2012

Использование Enum.IsDefined

пример:

public enum enStage {Work, Payment, Record, Return, Reject};
int StageValue = 4;

Enum.IsDefined(typeof(enStage), StageValue)
1 голос
/ 16 марта 2011
UserStatus userStatus = null;
Eum.TryParse<UserStatus>(status.ToString(), out userStatus);

if(userStatus != null)
{
  //it is not in the list
}
1 голос
/ 16 марта 2011

Почему бы не создать метод для его инкапсуляции?

public bool UnVerifiedOrActive(User user)
{
    return (user.UserStatus == UserStatus.Unverified || 
            user.UserStatus == UserStatus.Active);
}
0 голосов
/ 16 марта 2011

Вы можете попробовать следующее

UserStatus ustatus;
if(Enum.TryParse<UserStatus>(c.ToString(), out ustatus))
{
 ..Your logic
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...