我需要以最快的方式来验证针对给定规则的输入字符串。在这种情况下,只能说Alpha只有字符。
我可以想到许多冗长和非冗长的方式。然而,执行速度至关重要。因此,如果有人能够提供他们的智慧珍珠,我将非常感激。
我正在避免使用正则表达式来摆脱创建表达式对象的开销。但是,如果人们认为这是最快的选择,我可以重新审视。
目前的想法包括: 1)
internal static bool Rule_AlphaOnly(string Value)
{
char[] charList = Value.ToCharArray();
for (int i = 0; i < charList.Length; i++)
{
if (!((charList[i] >= 65 && charList[i] <= 90) || (charList[i] >= 97 && charList[i] <= 122)))
{
return false;
}
}
return true;
}
2)
char[] charList = Value.ToCharArray();
return charList.All(t => ((t >= 65 && t <= 90) || (t >= 97 && t <= 122)));
考虑使用“包含”方法。
欢迎任何想法。 非常感谢
3) for(int i = 0; i&lt; Value.Length; i ++) { if(!char.IsLetter(Value,i)) { 返回false; } }
答案 0 :(得分:4)
通过删除ToCharArray
调用从而避免复制,可以提高两个代码的效率:您可以直接访问字符串的各个字符。
在这两种方式中,除非你能证明它太慢,否则我会强烈选择第二种方式。只有这样我才会切换到第一个,但用for
循环替换foreach
循环。
哦,你的代码都没有正确处理Unicode。如果您使用了具有正确字符类的正则表达式,那么这不是问题。 正确性,性能第二。
答案 1 :(得分:4)
不确定这个的速度,但是......
foreach(char c in Value)
{
if(!char.IsLetter(c))
return false;
}
答案 2 :(得分:0)
在C#编译器和JIT完成优化后,我怀疑这比手动for
循环慢得多:
return Value.All(char.IsLetter);
如果您需要检查任意字符集,请执行以下操作:
var set = new HashSet<char>(new[] { 'a', 'b', 'c' /* Etc... */ });
return Value.All(set.Contains);
除非set
是微不足道的,并且可以通过很少的if
来有效地“模拟”,否则哈希表查找必须是一个快速的解决方案。