0

我系统中的用户可以拥有电子邮件、手机或电话,并且根据传递的值,我正在检查一些条件,然后为每个条件设置 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;
    }

有没有更简单/更短的方法来写这个?

4

2 回答 2

6

如果您告诉我们枚举的值是什么,将会有所帮助。听起来您至少希望其中一个值有效,并且所有值都未初始化或有效。因此,一种表达方式是:

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

或者如果状态枚举是 just IsValid, IsUninitializedand (say) IsInvalid,并且您知道这些值实际上会在该集合中,您可以编写:

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

另外,我建议您从每个枚举值中删除“is”前缀 - 它只是使代码更难阅读 IMO 的绒毛。

于 2012-09-27T20:55:52.760 回答
0
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));
于 2012-09-27T20:56:23.360 回答