最快的方式可以将字符串验证为Alphas或给定的字符串集

时间:2011-10-13 09:17:28

标签: c# string contains alpha

我需要以最快的方式来验证针对给定规则的输入字符串。在这种情况下,只能说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;     }     }

3 个答案:

答案 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来有效地“模拟”,否则哈希表查找必须是一个快速的解决方案。