我在c#中编写了以下用于检查各种测试的代码,如果有任何失败,则结果为false,并且不希望执行其他检查。
我编码的方式似乎“丑陋”,我想知道是否有一个更优雅的解决方案,因为今天早上大脑褪色而失踪。
//check the rules
bool isValid = CheckPhoneFormat();
if (isValid)
{
isValid = CheckDoNotCall();
}
if (isValid)
{
isValid = CheckStatusActive();
}
if (isValid)
{
isValid = CheckOCV();
}
if (isValid)
{
isValid = CheckCard();
}
customer.IsValid = isValid;
答案 0 :(得分:9)
这增加了创建状态机的开销:
static Enumerable<Func<bool>() GetRules()
{
yield return CheckPhoneFormat();
yield return CheckDoNotCall();
yield return CheckStatusActive();
yield return CheckOCV();
yield return CheckCard();
}
bool oneValid = GetRules().Any(b => b);
bool allValid = GetRules().All(b => b);
如果您愿意,效率更高:
static IEnumerable<Func<bool>> arr = new Func<bool>[]
{
() => CheckPhoneFormat(),
() => CheckDoNotCall(),
() => CheckStatusActive(),
() => CheckOCV(),
() => CheckCard();
};
bool oneValid = arr.Any(b => b);
bool allValid = arr.All(b => b);
答案 1 :(得分:5)
是:
bool isValid = CheckPhoneFormat() && CheckDoNotCall()
&& CheckStatusActive() && CheckOCV() && CheckCard();
customer.IsValid = isValid;
&&
运算符仅在第一个操作数为true
时才计算第二个操作数。
修改强>
由于您调用的所有方法都是无参数的,因此请考虑将它们转换为只用属性(并重命名)。它可能有助于调试。
bool isValid = IsValidPhoneFormat && IsValidDoNotCall
&& IsValidStatusActive && IsValidOCV && IsValidCard;
customer.IsValid = isValid;
答案 2 :(得分:2)
如果检查失败,您可以使用&&
短路:
customer.IsValid = CheckPhoneFormat() && CheckDoNotCall() && CheckStatusActive() ...;
请注意,您甚至不需要if
,您可以直接指定布尔值。