C# 在IF语句中可以使用三元表达式吗? 我只是在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; }
基本上我只是想缩短这个时间C# 在IF语句中可以使用三元表达式吗? 我只是在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; },c#,.net,C#,.net,基本上我只是想缩短这个时间 alpha = (allowSpaces) ? (char.IsLetter(c) || c.Equals(' ')) : char.IsLetter(c); if (!alpha) return false; 如果我调用IsAlpha(“abcd”,false)该方法似乎总是返回false。我不确定三元语句中是否有逻辑错误,或者我试图做的是不可能的。基本上只是想知道是否有可能让if语句根据allowSpaces的值计算两个表达式中
alpha = (allowSpaces) ? (char.IsLetter(c) || c.Equals(' ')) : char.IsLetter(c);
if (!alpha)
return false;
如果我调用
IsAlpha(“abcd”,false)
该方法似乎总是返回false。我不确定三元语句中是否有逻辑错误,或者我试图做的是不可能的。基本上只是想知道是否有可能让if语句根据allowSpaces
的值计算两个表达式中的一个。但是相反,我认为它只是计算if(!allowSpace)
并在那里返回false。没有什么可以阻止您在if
条件中使用三元-但是代码>之前,三元值仅应用于(allowSpaces)
,而不是三元值的结果。(这是因为一元运算符的值高于三元运算符或条件运算符)
您需要插入括号,以便代码>应用于条件的结果:
if (!(allowSpaces ? (char.IsLetter(c) || c.Equals(' ')) : char.IsLetter(c)))
可能更清楚的是放弃三元:
if (!char.IsLetter(c) && !(allowSpaces && c.Equals(' ')))
没有什么能阻止您在if
条件中使用三元-但是代码>之前,三元值仅应用于(allowSpaces)
,而不是三元值的结果。(这是因为一元运算符的值高于三元运算符或条件运算符)
您需要插入括号,以便代码>应用于条件的结果:
if (!(allowSpaces ? (char.IsLetter(c) || c.Equals(' ')) : char.IsLetter(c)))
可能更清楚的是放弃三元:
if (!char.IsLetter(c) && !(allowSpaces && c.Equals(' ')))
当扩展如此简单和清晰时,为什么还要担心压缩呢
if(char.IsLetter(c)) return true;
if(allowSpace && c.Equals(' '))return true;
return false;
它甚至读起来和你想做的完全一样。
您的有效案例是“字母”和“空白,如果明确允许”
通过避免术语的合并,每个条件甚至都针对源代码管理进行了优化。可能没有什么理由更改alpha检查的逻辑,但是如果您要使用业务规则来执行验证,那么这些规则中的每一条都可以轻松地独立维护
从性能的角度来看,我们甚至对字母进行了优化,测试仅在首次发现字符不是字母时执行合取逻辑
如果您死心塌地地想将其压缩成一行,并删除continue
s,则将这两个验证测试中的每一个的否定结合起来,作为您的检查门返回false
,但如果您需要在验证检查中添加第三、第四或第五项,您几乎必须修改结构以使其易读
foreach(var c in value)
{
if(!char.IsLetter(c) && !(allowSpace && c.Equals(' ')) return false;
}
foreach(价值中的var c)
{
if(!char.isleter(c)&&!(allowSpace&&c.Equals(“”))返回false;
}
当扩展如此简单和清晰时,为什么还要担心压缩呢
if(char.IsLetter(c)) return true;
if(allowSpace && c.Equals(' '))return true;
return false;
它甚至读起来和你想做的完全一样。
您的有效案例是“字母”和“空白,如果明确允许”
通过避免术语的合并,每个条件甚至都针对源代码管理进行了优化。几乎没有理由更改alpha检查的逻辑,但是如果要使用业务规则来执行验证,则可以轻松地独立维护这些规则
从性能的角度来看,我们甚至对字母进行了优化,测试仅在首次发现字符不是字母时执行合取逻辑
如果您死心塌地地想将其压缩成一行,并删除continue
s,那么将这两个验证测试中的每一个的否定结合起来,因为您的gate around返回false
,但是如果您需要在验证检查中添加第三、第四或第五项,您几乎必须修改结构的易读性
foreach(var c in value)
{
if(!char.IsLetter(c) && !(allowSpace && c.Equals(' ')) return false;
}
foreach(价值中的var c)
{
if(!char.isleter(c)&&!(allowSpace&&c.Equals(“”))返回false;
}
这是可能的,但很令人困惑。你最好使用普通的布尔逻辑。你的逻辑在这两种选择之间不是倒退了吗?@EdCottrell这是公平的,我同意。我只是利用这段时间来学习什么是可能的,不一定是什么是最具可读性的。我可能会把它作为后者,我只是好奇前者是不是可行。@TimSchmelter,因为在只计算字符串中的第一个字符后,如果alpha==true
,我不希望函数结束。@KirkWoll是的,你是对的。今天早上太累了。但是对于“abc”的测试用例
这两种方式都不重要。这是可能的,但很容易混淆。你最好使用普通的布尔逻辑。你的逻辑不是在两种选择之间倒转吗?@EdCottrell这是公平的,我同意。我只是利用这段时间来了解什么是可能的,不一定是最可读的。我可能会把它作为拿铁r、 我只是好奇前者是否可行。@TimSchmelter因为如果在只计算字符串中的第一个字符后,alpha==true
,我不希望函数结束。@KirkWoll是的,你是对的。今天早上太累了。但是对于的测试用例“abc”
这两种方式都不重要。为了回答你的第一个问题,我的问题的目的只是“什么是可能的?”而不是“什么是最好的?”这与效率或“将一个函数的纳秒数减少”无关但这纯粹是好奇。那个么,三元当然是可能的。但要知道,您重复了您的char.isleter(c)规范
通过跳入跳出可选条件进行检查。无论如何,三元代码不会改进原始代码。正如我所说的。使用我发布的方法,它不起作用。我不知道这是因为我有一个逻辑错误(毕竟我们都犯了错误),还是根本不可能。就这么简单。作为(希望)有用的建议,我