Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有一种更简单的方法来检查一个枚举是否具有特定的值,而其他枚举是否具有其他值_C# - Fatal编程技术网

C# 是否有一种更简单的方法来检查一个枚举是否具有特定的值,而其他枚举是否具有其他值

C# 是否有一种更简单的方法来检查一个枚举是否具有特定的值,而其他枚举是否具有其他值,c#,C#,我的系统中的用户可以有电子邮件、手机或电话,根据传递的值,我正在检查一些条件,然后为每个设置ContactDataStatus(这是一个枚举)。然后我检查ContactDataStatus以确定提供的联系方式是否有效 枚举具有以下定义 public enum ContactDataStatus { ExistsButUnverified = 1, ExisitsAndVerified = 2, IsValid = 3,

我的系统中的用户可以有电子邮件、手机或电话,根据传递的值,我正在检查一些条件,然后为每个设置ContactDataStatus(这是一个枚举)。然后我检查ContactDataStatus以确定提供的联系方式是否有效

枚举具有以下定义

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