在进行不区分大小写的比较时,将字符串转换为大写或小写更有效吗?它甚至重要吗?
建议in this SO post C#对ToUpper更有效,因为“Microsoft以这种方式优化了它”。但我也读过this argument,转换ToLower和ToUpper取决于你的字符串包含的内容,并且通常字符串包含更多小写字符,这使得ToLower更有效。
特别是,我想知道:
答案 0 :(得分:88)
由于某些文化,特别是土耳其的“有趣”特征,转换为大写或小写以进行不区分大小写的比较是不正确的。相反,请使用StringComparer和相应的选项。
MSDN对字符串处理有一些great guidelines。您可能还想检查代码是否通过了the Turkey test。
编辑:注意Neil关于序数不区分大小写的比较的评论。整个领域非常模糊:(
答案 1 :(得分:22)
来自MSDN上的Microsoft:
Best Practices for Using Strings in the .NET Framework
字符串使用建议
- 在规范化字符串以进行比较时,请使用String.ToUpperInvariant方法代替String.ToLowerInvariant方法。
为什么呢?来自Microsoft:
将字符串规范化为大写
有一小部分字符在转换为小写时无法进行往返。
这种不能往返的角色的例子是什么?
ρ,Ρ,ρ
这就是为什么,如果您想要进行不区分大小写的比较,则将字符串转换为大写,而不是小写。
答案 2 :(得分:18)
根据MSDN传递字符串并告诉比较忽略大小写更有效:
String.Compare(strA,strB,StringComparison.OrdinalIgnoreCase) 相当于(但比更快)调用
String.Compare(ToUpperInvariant(strA),ToUpperInvariant(strB),StringComparison.Ordinal)。
这些比较仍然很快。
当然,如果你一遍又一遍地比较一个字符串,那么这可能不成立。
答案 3 :(得分:12)
基于倾向于拥有更多小写条目的字符串,ToLower理论上应该更快(很多比较,但很少分配)。
在C中,或者当使用每个字符串中可单独访问的元素(例如C字符串或C ++中的STL字符串类型)时,它实际上是一个字节比较 - 因此比较UPPER
与{{1}没有区别}}。
如果您偷偷摸摸并将字符串加载到lower
数组中,则可以对整个字符串进行非常快速的比较,因为它可以一次比较4个字节。但是,加载时间可能会让它变得不值得。
为什么你需要知道哪个更快?除非您正在进行公制的比较,否则运行几个周期的速度与整体执行速度无关,并且听起来像是过早优化:)
答案 4 :(得分:6)
Microsoft已优化ToUpperInvariant()
,而非ToUpper()
。不同之处在于,不变性更具文化友好性。如果您需要对文化中可能不同的字符串进行不区分大小写的比较,请使用Invariant,否则不变的转换性能无关紧要。
我不能说ToUpper()或ToLower()是否更快。我从来没有尝试过,因为我从来没有遇到性能问题那么多的情况。
答案 5 :(得分:4)
如果你在C#中进行字符串比较,那么使用.Equals()而不是将两个字符串转换为大写或小写的速度要快得多。使用.Equals()的另一大优点是没有为2个新的大写/小写字符串分配更多的内存。
答案 6 :(得分:1)
真的不应该重要。对于ASCII字符,它绝对无关紧要 - 它只是一些比较,并且对于任一方向都有点翻转。 Unicode可能有点复杂,因为有些字符会以奇怪的方式改变大小写,但除非你的文字充满了那些特殊字符,否则确实应该没有任何区别。
答案 7 :(得分:1)
做得对,如果转换为小写,应该有一个小的,无关紧要的速度优势,但这是,正如许多人所暗示的,文化依赖并且不是在函数中继承而是在你转换的字符串中继承(很多小写字母意味着对内存的分配很少) - 如果你有一个包含大量大写字母的字符串,转换为大写字母会更快。
答案 8 :(得分:0)
它取决于。 如上所述,只有ASCII,它是相同的。 在.NET中,阅读并使用String.Compare正确的i18n内容(语言文化和unicode)。如果您对输入的可能性有所了解,请使用更常见的情况。
请记住,如果你正在做多个字符串比较,那么长度是一个很好的第一个鉴别器。
答案 9 :(得分:-2)
如果你在处理纯ASCII,那没关系。它只是一个OR x,32与AND x,224。 Unicode,我不知道......