你能在IF语句中使用三元表达吗?

时间:2015-07-10 12:33:17

标签: c# .net

我只是在工作中用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。

2 个答案:

答案 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;
   }