比较两个字符串,在 C# 中忽略大小写 [重复]

Posted

技术标签:

【中文标题】比较两个字符串,在 C# 中忽略大小写 [重复]【英文标题】:Comparing two strings, ignoring case in C# [duplicate] 【发布时间】:2011-09-16 07:14:33 【问题描述】:

以下两个哪个更有效? (或者也许还有第三种更好的选择?)

string val = "AStringValue";

if (val.Equals("astringvalue", StringComparison.InvariantCultureIgnoreCase))

if (val.ToLowerCase() == "astringvalue")

?

【问题讨论】:

我认为这是个错误的问题。正确的问题是“哪个更正确?” 还有 if (string.Compare(strA, strB, StringComparison.OrdinalIgnoreCase) == 0) 或 if (val.Equals("AStringValue", StringComparison.OrdinalIgnoreCase)),正确性通常归结为个人喜好,还有更多关于哪种方法正确的讨论***.com/questions/44288/… @asawyer,为什么它会“更正确”而不是“更有效”? Jon Skeet 已经回答了这个here。 我更喜欢 Equals,因为它是 Ronsell(它按照它在锡上所说的)在一行中。 ToLowerCase 需要阅读上面的行,结合他们的逻辑来找出你为什么要小写任何东西。 【参考方案1】:

如果您正在寻找效率,请使用:

string.Equals(val, "astringvalue", StringComparison.OrdinalIgnoreCase)

顺序比较可能比文化感知比较快得多。

但是,如果您要对同一个字符串进行大量比较,那么ToLowerCase 可能是更好的选择。

与任何性能优化一样:衡量它,然后决定!

【讨论】:

在调用静态方法时,我总是使用类名,如String.Equals,大写“S”,或者例如Int32.Parse,而不是int.ParseOrdinalIgnoreCase 的好提示。谢谢。 如果对同一个字符串进行大量比较,为什么 ToLowerCase 会是一个更好的选择?通过这样做,您每次都必须“降低”另一个字符串,这可能会很昂贵。 @FrederikGheysels 我认为 Sven 建议您将 ToLower() 的结果存储在一个变量中,然后针对该变量执行每个比较。 Microsoft 似乎建议您使用 ToUpperInvariant 而不是 ToLower - msdn.microsoft.com/en-us/library/dd465121.aspx - 用于您的多重比较方案。无论哪种情况,它都应该是一个 Invariant 方法。 @FrederikGheysels 正确,但 StringComparer.OrdinalIgnoreCase 的文档指出“OrdinalIgnoreCase 属性返回的 StringComparer 将要比较的字符串中的字符视为使用不变的文化,然后执行一个独立于语言的简单字节比较。” (见msdn.microsoft.com/en-us/library/…)。如果您可以存储比较左侧的结果,则只需在右侧完成工作。【参考方案2】:

第一个是正确的,恕我直言,效率更高,因为第二个“解决方案”实例化了一个新的字符串实例。

【讨论】:

但抛开效率不谈,我看到第二种解决方案的使用要多得多,因为它有效,更短,更容易输入,并且具有易于记忆、直接的格式。 “StringComparison.InvariantCultureIgnoreCase”……真的吗? @BengalTigger 至少,第二个示例应该使用ToLowerInvariant()。但是,第一个可能会实例化两个新的字符串实例,所以不一定更快。【参考方案3】:

.ToLowerCase 版本不会更快 - 它涉及额外的字符串分配 (必须稍后收集)等。

就个人而言,我会使用

string.Equals(val, "astringvalue",  StringComparison.OrdinalIgnoreCase)

这避免了文化敏感字符串的所有问题,但结果它避免了文化敏感字符串的所有问题。只有您知道在您的上下文中这是否可行。

使用string.Equals 静态方法可以避免val 成为null 的任何问题。

【讨论】:

你能告诉我们为什么你使用 StringComparison.OrdinalIgnoreCase 而不是 StringComparison.InvariantCultureIgnoreCase? @mqpasta - 当然,这取决于目的,但msdn.microsoft.com/en-us/library/… “这在比较以编程方式生成的字符串或比较不区分大小写的资源(如路径和文件名)时最合适。” - 另外,它有点快【参考方案4】:

我对这种关于“效率”的问题的一般回答几乎总是,哪个版本的代码最易读,效率最高。

话虽如此,我认为(val.ToLowerCase() == "astringvalue") 对大多数人来说一目了然。

我所指的效率不一定是代码的执行,而是相关代码的维护和一般可读性。

【讨论】:

【参考方案5】:

我敢冒险,最安全的方法是使用 String.Equals 来减少 val 为 null 的可能性。

【讨论】:

【参考方案6】:

前者最快。原来val 是不可变的,因此使用 String.ToLowerCase() 创建了一个新的字符串对象,而不是直接与字符串比较器进行比较。如果您每秒执行多次,创建一个新的字符串对象可能会很昂贵。

【讨论】:

【参考方案7】:

您可能还想查看已回答的问题 Differences in string compare methods in C#

【讨论】:

【参考方案8】:

1st 更有效(也是最好的选择),因为val.ToLowerCase() 创建了一个新对象,因为字符串是不可变的。

【讨论】:

以上是关于比较两个字符串,在 C# 中忽略大小写 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

忽略词缀检查器的大小写[重复]

.NET如何比较两个代表文件名的字符串忽略大小写正确

为啥sql比较忽略大小写[重复]

AC日记——忽略大小写的字符串比较 openjudge 1.7 16

C# RegEx:忽略大小写...在模式中?

C++ , winapi 比较两个 WCHAR * 字符串