我只是在工作中用C#重写一个旧的C ++应用程序,所以我认为在实际的工作很慢的时候我会乱搞并尝试学习新的东西。我认为这有点多余并且违背了IF / ELSE声明的目的,但是可以这样做吗?
public static bool IsAlpha(string s, bool allowSpaces)
{
foreach (char c in s)
{
if (!(allowSpaces) ? (char.IsLetter(c) || c.Equals(' ')) : char.IsLetter(c))
return false;
}
return true;
}
基本上我只是想缩短它;
alpha = (allowSpaces) ? (char.IsLetter(c) || c.Equals(' ')) : char.IsLetter(c);
if (!alpha)
return false;
如果我调用IsAlpha("abcd", false)
,该方法似乎总是返回false。我不确定我在三元语句中是否存在逻辑错误,或者我正在尝试做的事情是不可能的。基本上只是想知道是否有可能使IF语句根据allowSpaces
的值来评估两个表达式中的一个。但相反,我认为它只是评估if (!allowSpace)
并在那里返回false。
答案 0 :(得分:5)
没有什么可以阻止你在if
条件下使用三元组 - 但是你的三元组之前的!
仅应用于(allowSpaces)
,而不是三元组的结果。 (这是因为一元运算符比三元运算符高precedence,或者条件。
您需要括起来,以便!
适用于条件的结果:
if (!(allowSpaces ? (char.IsLetter(c) || c.Equals(' ')) : char.IsLetter(c)))
放弃三元组可能更清楚:
if (!char.IsLetter(c) && !(allowSpaces && c.Equals(' ')))
答案 1 :(得分:0)
当膨胀如此简单明了时,为什么还要担心冷凝?
if(char.IsLetter(c)) return true; if(allowSpace && c.Equals(' '))return true; return false;
如果你想在vallation循环中处理它,那么执行这个逻辑的非常简单的选择是continue
而不是返回true
foreach(var c in value) { if(char.IsLetter(c)) continue; if(allowSpace && c.Equals(' '))continue; return false; } return true;
它甚至读起来就像你想要做的那样。 您的有效案件是" letter"和#34;如果明确允许,则为空格"
通过避免术语的结合,每个条件甚至针对源控制进行了优化。可能没有什么理由改变alpha检查的逻辑,但如果你要使用业务规则来执行验证,那么每个规则都可以很容易地独立维护。
从性能角度来看,我们甚至针对字母进行了优化,如果首次发现字符不是字母,则测试仅执行连接逻辑。
如果你已经将它凝结成一个衬里并移除continue
s,那么将这两个验证测试中的每一个的否定结合起来作为return false
的门,但如果你需要在验证检查中添加第三,第四或第五项,您几乎必须修改结构以便易读。
foreach(var c in value) { if(!char.IsLetter(c) && !(allowSpace && c.Equals(' ')) return false; }