值在枚举列表中

Jer*_*ose 29 .net c# linq lambda enums

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

例如,我有这个枚举:

public enum UserStatus
{
    Unverified,
    Active,
    Removed,
    Suspended,
    Banned
}
Run Code Online (Sandbox Code Playgroud)

现在我想检查一下 status in (Unverified, Active)

我知道这有效:

bool ok = status == UserStatus.Unverified || status == UserStatus.Active;
Run Code Online (Sandbox Code Playgroud)

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

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

Che*_*hen 68

这是一种在很多情况下有很多帮助的扩展方法.

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

用法:

Console.WriteLine(1.In(2, 1, 3));
Console.WriteLine(1.In(2, 3));
Console.WriteLine(UserStatus.Active.In(UserStatus.Removed, UserStatus.Banned));
Run Code Online (Sandbox Code Playgroud)

  • .NET 4.0+ 有一个内置函数“Enum.HasFlag(Enum)”。在此示例中,您可以像“bool ok = (UserStatus.Unverified | UserStatus.Active).HasFlag(status);”那样使用它。更多这里,/sf/answers/4297264891/ (2认同)

Fem*_*ref 24

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

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

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


小智 5

使用 Enum.IsDefined

例:

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

Enum.IsDefined(typeof(enStage), StageValue)
Run Code Online (Sandbox Code Playgroud)

  • 无法看出这是如何对照 5 个值中的 2 个进行检查的 (2认同)