值位于枚举列表中

问题描述 投票:0回答:7

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

例如,我有这个枚举:

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

现在我想检查是否

status in (Unverified, Active)

我知道这行得通:

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

但是必须有一种更优雅的方式来写这个。

这个问题的主题非常相似,但那是处理标志枚举,而这不是标志枚举。

c# .net linq lambda enums
7个回答
86
投票

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

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));

35
投票

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

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

否则就无法绕过长

||
谓词来检查每个允许的值。


8
投票

使用

Enum.IsDefined

示例:

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

Enum.IsDefined(typeof(enStage), StageValue)

2
投票

您可以在 .NET 4.0+ 中使用 Enum.HasFlag(Enum) 方法来执行此操作,

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);

1
投票

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

public bool UnVerifiedOrActive(User user)
{
    return (user.UserStatus == UserStatus.Unverified || 
            user.UserStatus == UserStatus.Active);
}

0
投票
UserStatus userStatus = null;
Enum.TryParse<UserStatus>(status.ToString(), out userStatus);

if(userStatus != null)
{
  //it is not in the list
}

-1
投票

您可以尝试以下

UserStatus ustatus;
if(Enum.TryParse<UserStatus>(c.ToString(), out ustatus))
{
 ..Your logic
}
© www.soinside.com 2019 - 2024. All rights reserved.