C# 验证字符串是否仅为字母或给定字符串集的最快方法

C# 验证字符串是否仅为字母或给定字符串集的最快方法,c#,string,contains,alpha,C#,String,Contains,Alpha,我需要尽可能快的绝对方法来根据给定的规则验证输入字符串。在这种情况下,请不要说字母字符 我可以想出很多方法,包括冗长和不冗长。然而,执行速度至关重要。因此,如果有人能提供他们的智慧之珠,我将万分感激 我避免使用正则表达式来避免创建表达式对象的开销。然而,如果人们认为这是最快的选择,我愿意重新考虑 目前的想法包括: (一) 仅限内部静态布尔规则(字符串值) { char[]charList=Value.ToCharArray(); for(int i=0;i=65&&charList[i]=97&

我需要尽可能快的绝对方法来根据给定的规则验证输入字符串。在这种情况下,请不要说字母字符

我可以想出很多方法,包括冗长和不冗长。然而,执行速度至关重要。因此,如果有人能提供他们的智慧之珠,我将万分感激

我避免使用正则表达式来避免创建表达式对象的开销。然而,如果人们认为这是最快的选择,我愿意重新考虑

目前的想法包括: (一)

仅限内部静态布尔规则(字符串值)
{
char[]charList=Value.ToCharArray();
for(int i=0;i如果(!((charList[i]>=65&&charList[i]=97&&charList[i]((t>=65&&t=97&&t删除
tocharray
调用从而避免复制,这两种代码都可以更有效:您可以直接访问字符串的各个字符

在这两种方式中,我强烈选择第二种,除非你能证明它太慢。只有这样,我才会切换到第一种,但将
for
循环替换为
foreach
循环


哦,您的两个代码都没有正确处理Unicode。如果您使用了具有正确字符类的正则表达式,那么这就不会是问题。正确性第一,性能第二。通过删除
tocharray
调用,从而避免复制,这两个代码都可以变得更有效:您可以访问他直接输入字符串中的单个字符

在这两种方式中,我强烈选择第二种,除非你能证明它太慢。只有这样,我才会切换到第一种,但将
for
循环替换为
foreach
循环


哦,您的两个代码都没有正确处理Unicode。如果您使用了具有正确字符类的正则表达式,那么这不会是一个问题。正确性第一,性能第二。

不确定这一个的速度,但是

foreach(char c in Value)
{
   if(!char.IsLetter(c))
      return false;
}

不确定这辆车的速度,但是

foreach(char c in Value)
{
   if(!char.IsLetter(c))
      return false;
}
在C#编译器和JIT完成优化后,我怀疑这将比手动
for
循环慢得多:

return Value.All(char.IsLetter);

如果需要检查任意字符集,请执行以下操作:

var set = new HashSet<char>(new[] { 'a', 'b', 'c' /* Etc... */ });
return Value.All(set.Contains);
var set=newhashset(new[]{'a','b','c'/*等...*/});
返回值.All(set.Contains);
除非
集合
很小,并且可以通过几次
if
有效地“模拟”,否则哈希表查找必定是一个尽可能快的解决方案。

在C#编译器和JIT对其进行优化后,我怀疑这将比手动
for
循环慢得多:

return Value.All(char.IsLetter);

如果需要检查任意字符集,请执行以下操作:

var set = new HashSet<char>(new[] { 'a', 'b', 'c' /* Etc... */ });
return Value.All(set.Contains);
var set=newhashset(new[]{'a','b','c'/*等...*/});
返回值.All(set.Contains);

除非
集合
微不足道且可以“模拟”通过几次
if
s,哈希表查找必然是最快的解决方案。

最好的方法是尝试一组不同的解决方案,并对其进行分析。对约1000个字符串进行分析,并测量每个方法所用的秒数。最好的方法是尝试一组不同的解决方案,并对其进行分析。对约1个字符串进行分析000个字符串并测量每个方法所用的秒数。实际上,.NET的正则表达式不能正确处理Unicode。它们在BMP之外的任何东西上都不能正常工作(都只是代理项)。例如:
regex.IsMatch("@Porges是一个很好的例子。但是,如果正则表达式都不能正确处理这个问题,那么手工处理可能会更困难–例如,
char.isleter
也不能正确处理这个问题。是的,在.NET中处理Unicode很糟糕。要在Unicode字符串上迭代,您需要手动使用
char.IsSurrogate
方法,或者
StringInfo
(它还将处理组合字符)。然后可以对正确处理它的字符使用
char.isleter(string,index)
。好的,那么……我已经给出了以下内容,有任何异议或进一步的评论吗?for(int I=0;Ichar.isleter(value,I)
的效果并不比另一个变体好,至少在他发布的示例中是这样。也许组合变音符号会有所不同,我还没有测试过。实际上,.NET的正则表达式不能正确处理Unicode。它们在BMP之外的任何东西上都不能正常工作(都只是代理)。例如:
regex.IsMatch("@Porges是一个很好的例子。但是,如果正则表达式都不能正确处理这个问题,那么手工处理可能会更困难–例如,
char.isleter
也不能正确处理这个问题。是的,在.NET中处理Unicode很糟糕。要在Unicode字符串上迭代,您需要手动使用
char.IsSurrogate
方法,或者
StringInfo
(它还将处理组合字符)。然后可以对正确处理它的字符使用
char.isleter(string,index)
。好的,那么……我已经给出了以下内容,有任何异议或进一步的评论吗?for(int I=0;Ichar.isleter(value,I)
的效果并不比另一个变体好,至少在他发布的示例中是这样。也许组合变音符号会有所不同,我还没有对此进行测试。这使用了for-each,我相信它仍然比for-I-char[I]循环器慢,不过我们会看看char.isleter位。Thanks@DubMan不要相信,测量