我经常读到将字符串转换为大写字母是一种很好的做法(我认为Hanselman很久以前就在他的博客上提到了这一点),当该字符串要与另一个字符串进行比较时(也应该将其转换为大写)。
这有什么好处?我为什么要这样做(或者在我不应该这样做的情况下)?
由于
答案 0 :(得分:7)
不,你应该使用enum选项,允许不区分大小写的比较({{3p>
确保使用您正在使用的比较方法的重载,例如string comparison,String.Compare
答案 1 :(得分:4)
在进行比较时你应该转换为大写而不是小写的原因(并且实际上不可能进行一种情况下的比较)是一些(不常用的)字符不会转换为小写不丢失信息。
某些大写字符没有等效的小写字符,因此将它们设置为小写会将它们转换为不同的小写字符。这可能会导致比较误报。
答案 2 :(得分:1)
进行不区分大小写的字符串比较的更好方法是:
bool ignoreCase = true;
bool stringsAreSame = (string.Compare(str1, str2, ignoreCase) == 0)
另外,请看这里: Upper vs Lower Case
答案 3 :(得分:0)
这听起来像是一种不区分大小写比较的廉价方式。我想知道是否有一个函数可以为你做到这一点,而你不必明确告诉它大写。
答案 4 :(得分:0)
与小写字母之间的字符串比较相比,.Net框架在大写字母之间进行字符串比较的速度稍快一些。
正如其他人所提到的,从大写转换为小写时,某些信息可能会丢失。
您可能希望尝试使用StringComparer
对象进行不区分大小写的比较。
StringComparer comparer = StringComparer.OrdinalIgnoreCase;
bool isEqualV1 = comparer.Equals("stringA", "stringB");
bool isEqualV2 = (comparer.Compare("stringA", "stringB") == 0);
4.7版本的.Net Framework具有Span
类型,在某些情况下应该有助于加快字符串比较。
根据您的使用案例,您可能希望使用HashSet
和Dictionary
类型的构造函数,这些构造函数可以将StringComparer
作为构造函数的输入参数。
我通常使用StringComparer
作为默认值为StringComparer.OrdingalIgnoreCase
的方法的输入参数,如果速度很重要,我会尝试使用其他技术(使用HashSets,Dictionaries或Spans)
答案 5 :(得分:0)
字符串应规范化为大写。一小部分字符转换为小写字母后就无法往返。往返意味着将字符从一个语言环境转换为另一种代表字符数据的语言环境,然后从转换后的字符中准确检索原始字符。
参考:
答案 6 :(得分:-2)
您不必将字符串转换为大写字母。将其转换为小写8 - )