值在枚举列表中
Posted
技术标签:
【中文标题】值在枚举列表中【英文标题】:Value is in enum list 【发布时间】:2011-07-16 06:57:07 【问题描述】:我有一个相当基本的问题:如何检查给定值是否包含在枚举值列表中?
例如,我有这个枚举:
public enum UserStatus
Unverified,
Active,
Removed,
Suspended,
Banned
现在我想检查status in (Unverified, Active)
我知道这行得通:
bool ok = status == UserStatus.Unverified || status == UserStatus.Active;
但是必须有一种更优雅的方式来编写它。
this question 的主题很相似,但都是处理 flags 枚举,而这不是 flags 枚举。
【问题讨论】:
status变量的数据类型是什么? @Lav 变量status
的类型为UserStatus
。
【参考方案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));
【讨论】:
是的,这正是我想要的。同样,不知道为什么这不是内置的,但至少它是可能的。 :) 谢谢! 这是一个非常好的方法! 漂亮的代码...没想到扩展方法的this
类型参数可以是泛型的。
.NET 4.0+ 有一个内置函数,Enum.HasFlag(Enum)
。在此示例中,您可以像 bool ok = (UserStatus.Unverified | UserStatus.Active).HasFlag(status);
一样使用它。更多在这里,***.com/a/61389498/4294275
好的。对不起。非常基本的问题。这段代码应该属于哪里?【参考方案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)
【讨论】:
看不到这是如何检查 5 个值中的 2 个的【参考方案4】:您可以在 .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、2、4、8、16、32、64,...)时才有效。【参考方案5】:UserStatus userStatus = null;
Eum.TryParse<UserStatus>(status.ToString(), out userStatus);
if(userStatus != null)
//it is not in the list
【讨论】:
我认为这行不通,因为它会检查枚举中的每个值,而不是值的子集(如果我没看错的话)。 @Jerad 这行得通。试一试。我和Lav
发布的解决方案相同
@Avian - 但是您在哪里只检查未验证或活动值(与其他三个值相比)?
@Jerad。我的错。回答办公室的问题并没有给我太多时间阅读您的问题。
@Avian - 我明白,没问题。尽管如此,还是感谢您的尝试。【参考方案6】:
为什么不创建一个方法来封装它?
public bool UnVerifiedOrActive(User user)
return (user.UserStatus == UserStatus.Unverified ||
user.UserStatus == UserStatus.Active);
【讨论】:
谢谢,但这不是 DRY 的问题,更多的是简洁的代码。我仍然不确定为什么 C# 没有某种in
运算符可用于此类情况。【参考方案7】:
你可以试试关注
UserStatus ustatus;
if(Enum.TryParse<UserStatus>(c.ToString(), out ustatus))
..Your logic
【讨论】:
以上是关于值在枚举列表中的主要内容,如果未能解决你的问题,请参考以下文章