比较两个字符串,在 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.Parse
。 OrdinalIgnoreCase
的好提示。谢谢。
如果对同一个字符串进行大量比较,为什么 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# 中忽略大小写 [重复]的主要内容,如果未能解决你的问题,请参考以下文章