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

sha*_*shi 0 c#

我系统中的用户可以使用电子邮件,移动电话或电话,并根据传递的值检查某些条件,然后为每个条件设置ContactDataStatus(这是一个枚举).然后我检查ContactDataStatus以确定提供的联系人详细信息是否有效.

枚举具有以下定义

public enum ContactDataStatus
    {
        ExistsButUnverified = 1, 
        ExisitsAndVerified = 2, 
        IsValid = 3, 
        IsUninitialized = 4
    }
Run Code Online (Sandbox Code Playgroud)

如果要设置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;
    }
Run Code Online (Sandbox Code Playgroud)

是否有更简单/更短的方式来写这个?

Jon*_*eet 6

如果你告诉我们enum的价值是什么会有所帮助.听起来您希望至少有一个值有效,并且所有值都要么未初始化或有效.所以表达的一种方式是:

var statuses = new[] { emailStatus, mobileStatus, phoneStatus };
bool valid = statuses.Any(x => x == ContactDataStatus.IsValid) &&
             statuses.All(x => x == ContactDataStatus.IsValid ||
                               x == ContactDataStatus.IsUninitialized);
Run Code Online (Sandbox Code Playgroud)

或者,如果状态枚举只是IsValid,IsUninitialized和(比方说)IsInvalid,并且您知道值实际上在该集合中,您可以写:

var statuses = new[] { emailStatus, mobileStatus, phoneStatus };
bool valid = statuses.Any(x => x == ContactDataStatus.IsValid) &&
             statuses.All(x => x != ContactDataStatus.IsInvalid);
Run Code Online (Sandbox Code Playgroud)

另外,我建议您从每个枚举值中删除"is"前缀 - 这只是绒毛使得代码更难以读取IMO.