我有一个相当基本的问题:如何检查给定值是否包含在枚举值列表中?
例如,我有这个枚举:
public enum UserStatus
{
Unverified,
Active,
Removed,
Suspended,
Banned
}
现在我想检查一下status in (Unverified, Active)
我知道这有效:
bool ok = status == UserStatus.Unverified || status == UserStatus.Active;
但必须有更优雅的方式来写这个。
this question的主题非常相似,但是处理标志枚举,这不是标志枚举。
答案 0 :(得分:65)
这是一种在很多情况下有很多帮助的扩展方法。
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));
答案 1 :(得分:23)
如果是更长的枚举列表,您可以使用:
var allowed = new List<UserStatus> { UserStatus.Unverified, UserStatus.Active };
bool ok = allowed.Contains(status);
否则无法绕过长||
谓词,检查每个允许的值。
答案 2 :(得分:1)
为什么不创建一个封装它的方法?
public bool UnVerifiedOrActive(User user)
{
return (user.UserStatus == UserStatus.Unverified ||
user.UserStatus == UserStatus.Active);
}
答案 3 :(得分:1)
UserStatus userStatus = null;
Eum.TryParse<UserStatus>(status.ToString(), out userStatus);
if(userStatus != null)
{
//it is not in the list
}
答案 4 :(得分:1)
您可以使用Enum.HasFlag(Enum)方法在.NET 4.0及更高版本中完成此操作,
UserStatus status = UserStatus.Unverified; // just assumed status is Unverified
bool ok = (UserStatus.Unverified | UserStatus.Active).HasFlag(status);
您也可以通过将变量赋值给类似的方法来完成此操作,
UserStatus status = UserStatus.Active; // just assumed status is Active
UserStatus unverifiedOrActive = UserStatus.Unverified | UserStatus.Active;
bool ok = unverifiedOrActive.HasFlag(status);
答案 5 :(得分:0)
您可以尝试以下
UserStatus ustatus;
if(Enum.TryParse<UserStatus>(c.ToString(), out ustatus))
{
..Your logic
}