C# 是否有一种更简单的方法来检查一个枚举是否具有特定的值,而其他枚举是否具有其他值
我的系统中的用户可以有电子邮件、手机或电话,根据传递的值,我正在检查一些条件,然后为每个设置ContactDataStatus(这是一个枚举)。然后我检查ContactDataStatus以确定提供的联系方式是否有效 枚举具有以下定义C# 是否有一种更简单的方法来检查一个枚举是否具有特定的值,而其他枚举是否具有其他值,c#,C#,我的系统中的用户可以有电子邮件、手机或电话,根据传递的值,我正在检查一些条件,然后为每个设置ContactDataStatus(这是一个枚举)。然后我检查ContactDataStatus以确定提供的联系方式是否有效 枚举具有以下定义 public enum ContactDataStatus { ExistsButUnverified = 1, ExisitsAndVerified = 2, IsValid = 3,
public enum ContactDataStatus
{
ExistsButUnverified = 1,
ExisitsAndVerified = 2,
IsValid = 3,
IsUninitialized = 4
}
我编写了以下if条件来设置isValid变量
isValid = false;
if (emailStatus == ContactDataStatus.IsValid &&
(mobileStatus == ContactDataStatus.IsValid ||
mobileStatus == ContactDataStatus.IsUninitialized)
&& (phoneStatus == ContactDataStatus.IsValid ||
phoneStatus == ContactDataStatus.IsUninitialized))
{
isValid = true;
}
else if (mobileStatus == ContactDataStatus.IsValid &&
(emailStatus == ContactDataStatus.IsValid ||
emailStatus == ContactDataStatus.IsUninitialized) &&
(phoneStatus == ContactDataStatus.IsValid ||
phoneStatus == ContactDataStatus.IsUninitialized))
{
isValid = true;
}
else if (phoneStatus == ContactDataStatus.IsValid &&
(emailStatus == ContactDataStatus.IsValid ||
emailStatus == ContactDataStatus.IsUninitialized) &&
(mobileStatus == ContactDataStatus.IsValid ||
mobileStatus == ContactDataStatus.IsUninitialized))
{
isValid = true;
}
是否有一种更简单/更简短的方法来编写此内容?如果您告诉我们枚举的值是什么,会有所帮助。听起来您希望至少有一个值是有效的,而所有的值要么是未初始化的,要么是有效的。一种表达方式是:
var statuses = new[] { emailStatus, mobileStatus, phoneStatus };
bool valid = statuses.Any(x => x == ContactDataStatus.IsValid) &&
statuses.All(x => x == ContactDataStatus.IsValid ||
x == ContactDataStatus.IsUninitialized);
或者,如果状态枚举仅为IsValid
,IsUninitialized
和(比如)IsInvalid
,并且您知道这些值实际上会在该集合中,您可以编写:
var statuses = new[] { emailStatus, mobileStatus, phoneStatus };
bool valid = statuses.Any(x => x == ContactDataStatus.IsValid) &&
statuses.All(x => x != ContactDataStatus.IsInvalid);
另外,我建议您从每个枚举值中删除“is”前缀-这只是一种模糊,使代码更难阅读。如果您告诉我们枚举的值是什么,这会有所帮助。听起来您希望至少有一个值是有效的,而所有的值要么是未初始化的,要么是有效的。一种表达方式是:
var statuses = new[] { emailStatus, mobileStatus, phoneStatus };
bool valid = statuses.Any(x => x == ContactDataStatus.IsValid) &&
statuses.All(x => x == ContactDataStatus.IsValid ||
x == ContactDataStatus.IsUninitialized);
var statuses = new[] { emailStatus, mobileStatus, phoneStatus };
bool isValid = statuses
.Any(s => s == ContactDataStatus.IsValid && statuses.Except(new[] { s }).All(o => o == ContactDataStatus.IsValid || o == ContactDataStatus.IsUninitialized));
或者,如果状态枚举仅为IsValid
,IsUninitialized
和(比如)IsInvalid
,并且您知道这些值实际上会在该集合中,您可以编写:
var statuses = new[] { emailStatus, mobileStatus, phoneStatus };
bool valid = statuses.Any(x => x == ContactDataStatus.IsValid) &&
statuses.All(x => x != ContactDataStatus.IsInvalid);
此外,我建议您从每个枚举值中删除“is”前缀-这只是一种模糊,使代码更难阅读。如果您对每个条件使用多行,而不是让我们每次滚动,阅读起来会更简单。。。以及用文字描述您试图实现的目标。抱歉,我编辑了它以使其可读,并添加了我尝试执行的操作。如果您对每个条件使用多行,而不是让我们每次滚动,阅读会更简单。。。以及用文字描述您试图实现的目标。抱歉,我编辑了它以使其可读,并添加了我试图实现的内容。不,我相信如果值都是
IsValid
,则会给出true
。不,我相信如果值都是IsValid
,它将给出false
,而它应该给出true
。我添加了枚举的所有可能值。我添加了枚举的所有可能值。
var statuses = new[] { emailStatus, mobileStatus, phoneStatus };
bool isValid = statuses
.Any(s => s == ContactDataStatus.IsValid && statuses.Except(new[] { s }).All(o => o == ContactDataStatus.IsValid || o == ContactDataStatus.IsUninitialized));