2

注意:这是我出于历史兴趣提出的更多问题,因为我意识到现代语言具有内置的正则表达式和不区分大小写的字符串比较方法。

在比较未知大小写的两个字符串时,我记得读过基于 Microsoft 的转换方法,这些方法针对大写而不是小写进行了优化。所以:

If (stringA.ToUpper() == stringB.ToUpper()) { ... }

会比:

If (stringA.ToLower() == stringB.ToLower()) { ... }

如果这是真的,当您需要搜索时,将字符串数据存储为大写而不是小写会更好吗?

4

3 回答 3

11

在 .NET 中,我们可以执行以下操作:

if (String.Compare(stringA, stringB, StringComparison.InvariantCultureIgnoreCase) == 0) {...}

并且无需担心将字符串转换为大写或小写。更多关于这个here

于 2009-06-25T09:32:40.967 回答
3

在一般情况下没有安全的情况可以使用。

无论您做出何种选择,在某些情况下都会失败。

  • 有些语言没有大小写(不是真正的问题)。
  • 有些语言有第三种“标题”案例。
  • 有些字符不是往返的,例如 ToUpper("ß") 是 "SS",ToLower("SS") 是 "ss",但有些词只用 "ß" 和 "ss" 区分,所以会给出通过映射到大写来匹配误报(这将打破关于大小写映射不改变字符串长度的假设)。
  • 案例映射取决于语言。例如 ToLower("I") 是 "i",除非你在土耳其语或 Azari 中工作,结果是 "ı"(拉丁小写字母 Dotless I)并且 ToUpper("i") 是 "İ"(拉丁大写字母 I With上面的点)。

在过去基于 ToUpper 和 ToLower 的方法中,假设仅使用英文文本并忽略世界上的大多数字形和字符。为了获得更多启发,您需要使用大小写映射表作为不区分大小写比较的基础。

于 2009-06-25T09:46:36.260 回答
0

在 ANSI/ASCII 代码中,大写字母的值低于小写字母。“A”是代码 65,“a”是代码 97。二进制 01000001 和 01100001。)因此,小写字母和大写字母之间的区别只有一位。
但这对速度有影响吗?在所有情况下,都必须比较所有 8 位。因此,如果两个位都为 0,则比较两个位更快,则可以解释任何速度差异。这对我来说没有多大意义,但话又说回来,在某些较旧的处理器中,这在过去可能是正确的。
但如今呢?我想你不会注意到任何不同。


但是,将小写字母转换为大写字母可能存在速度差异,反之亦然。尤其是当您必须支持带有重音符号或其他非 ANSI 字母的字母时。在这些情况下,必须使用可能已针对一个方向优化的特殊映射。不是比较会变慢,而是转换会减慢速度。

于 2009-06-25T10:10:37.147 回答