Значение указано в списке перечислений
У меня есть довольно простой вопрос: как проверить, содержится ли данное значение в списке значений перечисления?
Например, у меня есть это перечисление:
public enum UserStatus
{
Unverified,
Active,
Removed,
Suspended,
Banned
}
Теперь я хочу проверить, если status in (Unverified, Active)
Я знаю, что это работает:
bool ok = status == UserStatus.Unverified || status == UserStatus.Active;
Но должен быть более элегантный способ написать это.
Тема this queston очень похожа, но это касается перечислений флагов, и это не переименование флагов.
Спасибо заранее.
Ответы
Ответ 1
Вот метод расширения, который помогает во многих обстоятельствах.
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));
Ответ 2
Если это длинный список перечислений, вы можете использовать:
var allowed = new List<UserStatus> { UserStatus.Unverified, UserStatus.Active };
bool ok = allowed.Contains(status);
В противном случае нет пути вокруг длинного предиката ||
, проверяющего каждое допустимое значение.
Ответ 3
Используйте Enum.IsDefined
Пример:
public enum enStage {Work, Payment, Record, Return, Reject};
int StageValue = 4;
Enum.IsDefined(typeof(enStage), StageValue)
Ответ 4
Почему бы не создать метод его инкапсуляции?
public bool UnVerifiedOrActive(User user)
{
return (user.UserStatus == UserStatus.Unverified ||
user.UserStatus == UserStatus.Active);
}
Ответ 5
UserStatus userStatus = null;
Eum.TryParse<UserStatus>(status.ToString(), out userStatus);
if(userStatus != null)
{
//it is not in the list
}
Ответ 6
Вы можете попробовать выполнить
UserStatus ustatus;
if(Enum.TryParse<UserStatus>(c.ToString(), out ustatus))
{
..Your logic
}