大多数时候我想进行字符串比较,我希望它们不区分大小写。
那么为什么.net中的字符串默认情况下是敏感的?
编辑1:要明确我认为以下默认情况下应该返回true。或者至少允许我有一个编译时标志来实现它。
"John Smith" == "JOHN SMITH"
编辑2:我可以想到更多应该不区分大小写的事情的例子
应该不区分大小写的事情示例
应该区分大小写的事情示例
答案 0 :(得分:4)
很抱歉这个简单的答案,但这就是它的方式:)
在基本级别,字符串表示为字符列表,其中“a”与“A”不同,因此它可能是最简单的表示\约定。在你的情况下,可以公平地说,大多数比较都是不区分大小写的,但我认为论证的另一面至少同样适用,并且采用了一个约定。
我想要使用一些辅助方法\类可以减轻你的痛苦。
答案 1 :(得分:2)
因为存在不同类型的不敏感匹配,并且不清楚您想要哪一种。以下是三种最常见的模式:
StringComparison.OrdinalIgnoreCase
StringComparison.InvariantCultureIgnoreCase
StringComparison.CurrentCultureIgnoreCase
他们有很多不同的用例。您可能没有注意到这一点,因为您每天都在处理ASCII。其他地区的用户会看到更多差异。
答案 2 :(得分:1)
因为不区分大小写不具备性能,并且因为即使您不打算也不行。
供应商需要根据性能进行竞争,因此默认选项往往是性能最佳的选项。最好的情况是,不区分大小写需要在比较之前将两个字符串折叠到一个常见的情况。在最坏的情况下,根据区域设置,它需要一个可以是两倍长的代码路径。如果供应商违反了性能较低的版本,竞争对手会选择最差情况进行基准测试。
由于区分大小写在某些搜索中失败,因此您必须在代码中解决此问题。它迫使有意识的决定。相反,即使在您不希望的情况下,不区分大小写也会起作用。而不是强迫你做出决定,而是创造一个你可以忽视它而不利于你的方案。作为选择架构的问题,供应商倾向于选择导致更少缺陷的选项 - 在这种情况下是区分大小写。
答案 3 :(得分:1)
字符“a”在内部存储有不同的ASCII或Unicode值作为“A”。说“a”与“A”相同并不“正确”。
当使用除英语之外的语言,使用哈希表等算法或使用许多加密/解密算法时,这种区别变得至关重要。
我的两分钱:区分大小写的比较是默认值,因为它是正确的。
答案 4 :(得分:0)
在VB.NET中,可以将“选项比较”设置为文本,以便不区分大小写,但我强烈反对它。我最喜欢的是当我需要不敏感地比较并阅读文本的小写版本时使用string.toLower()方法。
为什么呢?因为如果区分大小写在某些应用程序中的重要性,您还会比较其他什么呢?
答案 5 :(得分:0)
您无法更改现有类的行为。 mscorelib / system.core中定义的System.String
类覆盖==并定义了一个区分大小写的等式。
您所能做的就是为字符串添加扩展方法并实现不区分大小写:
public static class StringEqualityExtension
{
public static bool StringEquals(this string value, string other)
{
return value.ToLower()==other.ToLower();
}
}
// usage
string myString = "Some112";
string other = "sOME112";
bool equal = myString.StringEquals(myString);
答案 6 :(得分:0)
你的情况不一定是最常见的情况,一个非常常见的情况是将文档中的单词与语法条件相匹配,在这种情况下,区分大小写是绝对必须的。
注意在敏感方式的情况下匹配非常简单。实际上,字符串的equals方法具有专门用于指定如何比较的重载。
答案 7 :(得分:0)
我来到这里寻找解决同样问题的方法。现在差不多5年了......但我不介意,因为这是最早的搜索结果之一,我认为最好包含正确的信息。
根据this MSDN page,您只需要在文件中添加一行代码:
Option Compare Text
如果将上面的行添加到核心的开头,则告诉CLR从默认(Option Compare Binary
)切换到不区分大小写的比较。
我不知道这是否适用于C#。