C# 值位于枚举列表中

C# 值位于枚举列表中,c#,.net,linq,lambda,enums,C#,.net,Linq,Lambda,Enums,我有一个相当基本的问题:如何检查给定值是否包含在枚举值列表中 例如,我有这个枚举: public enum UserStatus { Unverified, Active, Removed, Suspended, Banned } 现在我想检查状态是否为(未验证,活动) 我知道这是可行的: bool ok = status == UserStatus.Unverified || status == UserStatus.Active; 但必须有一种更优

我有一个相当基本的问题:如何检查给定值是否包含在枚举值列表中

例如,我有这个枚举:

public enum UserStatus
{
    Unverified,
    Active,
    Removed,
    Suspended,
    Banned
}
现在我想检查
状态是否为(未验证,活动)

我知道这是可行的:

bool ok = status == UserStatus.Unverified || status == UserStatus.Active;
但必须有一种更优雅的方式来写这个


的主题非常类似,但它处理的是标志枚举,而这不是标志枚举。

如果是较长的枚举列表,则可以使用:

var allowed = new List<UserStatus> { UserStatus.Unverified, UserStatus.Active };
bool ok = allowed.Contains(status);
var allowed=新列表{UserStatus.Unverified,UserStatus.Active};
bool ok=允许。包含(状态);

否则,无法绕过长的
|
谓词,检查每个允许的值。

为什么不创建一个方法来封装它呢

public bool UnVerifiedOrActive(User user)
{
    return (user.UserStatus == UserStatus.Unverified || 
            user.UserStatus == UserStatus.Active);
}
你可以试试下面的

UserStatus ustatus;
if(Enum.TryParse<UserStatus>(c.ToString(), out ustatus))
{
 ..Your logic
}
UserStatus ustatus;
if(Enum.TryParse(c.ToString(),out-ustatus))
{
…你的逻辑
}
UserStatus UserStatus=null;
Eum.TryParse(status.ToString(),out userStatus);
if(userStatus!=null)
{
//它不在名单上
}

这里有一个扩展方法,它在很多情况下都很有帮助

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

使用
Enum.IsDefined

例如:

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

Enum.IsDefined(typeof(enStage), StageValue)

您可以在.NET 4.0+中使用

您也可以通过将

UserStatus status = UserStatus.Active; // just assumed status is Active

UserStatus unverifiedOrActive = UserStatus.Unverified | UserStatus.Active;

bool ok = unverifiedOrActive.HasFlag(status);

状态变量的数据类型是什么?@Lav变量
status
的类型是
UserStatus
。谢谢,但这并不是一个枯燥的问题,只是关于简洁的代码。我仍然不确定为什么C#在中没有某种类型的操作符,可以用于类似的情况。我认为这不会起作用,因为它检查的是枚举中的每个值,而不是值的子集(如果我读得正确)。@Jerad this有效。试试看。我的解决方案与
Lav
posted@Avian-但你在哪里检查未验证或有效值(与其他三个值相比)?@Jerad。我的错。回答办公室的问题并没有给我多少时间阅读你的问题。@Avian-我明白,没问题。谢谢你的尝试。是的,这正是我想要的。再说一次,我不知道为什么这不是内置的,但至少这是可能的谢谢这是一个非常好的方法!美丽的代码。。。我不知道扩展方法的
this
类型参数可以是泛型的..NET 4.0+为此内置了一个函数,
Enum.HasFlag(Enum)
。在本例中,您可以像这样使用它,
bool ok=(UserStatus.Unverified | UserStatus.Active)。更多,好的。我很抱歉。这是一个非常基本的问题。此代码属于何处?无法查看此代码如何检查5个值中的2个
public enum enStage {Work, Payment, Record, Return, Reject};
int StageValue = 4;

Enum.IsDefined(typeof(enStage), StageValue)
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);