以下两个中哪个更有效? (或者还有第三种更好的选择吗?)
string val = "AStringValue";
if (val.Equals("astringvalue", StringComparison.InvariantCultureIgnoreCase))
OR
if (val.ToLowerCase() == "astringvalue")
?
#1 楼
第一个是正确的,而恕我直言是效率更高的,因为第二个“解决方案”实例化了一个新的字符串实例。评论
但是除了效率之外,我看到第二种解决方案的用法更多,因为它可以工作,更短,更容易键入,并且具有易于记忆的简单格式。 “ StringComparison.InvariantCultureIgnoreCase” ...真的吗?
–孟加拉虎
16年8月29日19:00
@BengalTigger至少,第二个示例应该使用ToLowerInvariant()。但是,第一个可以很好地实例化两个新的字符串实例,因此不一定更快。
– jpaugh
17年6月13日在17:31
#2 楼
如果您正在寻找效率,请使用以下方法:string.Equals(val, "astringvalue", StringComparison.OrdinalIgnoreCase)
序数比较可以比文化意识的比较快得多。
ToLowerCase
可以但是,如果您要对同一字符串进行大量比较,则是更好的选择。和任何性能优化一样:测量它,然后决定!
评论
当调用静态方法时,我将始终使用类名,例如String.Equals,大写字母“ S”,例如Int32.Parse而不是int.Parse。关于OrdinalIgnoreCase的提示。谢谢。
– orad
13年11月16日在1:59
如果对同一字符串进行大量比较,为什么ToLowerCase会是更好的选择?这样,您每次都必须“降低”另一个字符串,这可能很昂贵。
– Frederik Gheysels
15年6月24日在13:45
@FrederikGheysels我认为Sven建议您将ToLower()的结果存储在一个变量中,然后对每个变量进行比较。
– pwdst
2015年9月10日下午16:28
Microsoft似乎建议您使用ToUpperInvariant而不是ToLower(msdn.microsoft.com/en-us/library/dd465121.aspx)进行多重比较。无论哪种情况,它都应该是不变方法。
– pwdst
2015年9月10日16:31
@FrederikGheysels正确,但StringComparer.OrdinalIgnoreCase的文档指出“由OrdinalIgnoreCase属性返回的StringComparer对待字符串中的字符进行比较,就像使用不变文化的约定将它们转换为大写字母一样,然后执行简单的字节比较与语言无关。” (请参阅msdn.microsoft.com/en-us/library/…)。如果您可以存储比较左侧的结果,则只需要在右侧进行操作即可。
– pwdst
2015年9月11日在12:21
#3 楼
.ToLowerCase
版本不会更快-它涉及额外的字符串分配(必须稍后收集),等等。
我个人使用
string.Equals(val, "astringvalue", StringComparison.OrdinalIgnoreCase)
这避免了所有对文化敏感的字符串的问题,因此,它避免了对文化敏感的字符串的所有问题。只有您知道在您的上下文中这是否可以。
使用
string.Equals
静态方法可以避免val
为null
的任何问题。评论
您能告诉我们为什么要使用StringComparison.OrdinalIgnoreCase而不是StringComparison.InvariantCultureIgnoreCase吗?
–mqpasta
11年6月16日在11:46
@mqpasta-当然,这取决于目的,但msdn.microsoft.com/zh-cn/library/…“当比较以编程方式生成的字符串或比较不区分大小写的资源(例如路径和文件名)时,这是最合适的。” -而且,速度要快一点
– Marc Gravell♦
11年6月16日在11:48
#4 楼
对于“效率”这类问题,我的一般回答几乎总是这样,哪一个版本的代码可读性最高,效率最高。话虽如此,我认为
(val.ToLowerCase() == "astringvalue")
很容易理解我所指的效率并不是执行代码所必需的,而在于所讨论代码的维护性和可读性。
#5 楼
我敢说最安全的方法是使用String.Equals
来减轻val是null
的可能性。#6 楼
前者最快。事实证明val
是不可变的,因此使用String.ToLowerCase()创建了一个新的字符串对象,而不仅仅是与字符串比较器的直接比较。如果您每秒执行多次此操作,则创建新的字符串对象可能会非常昂贵。#7 楼
第一个效率更高(也是最好的选择),因为val.ToLowerCase()
由于字符串是不可变的,因此会创建一个新对象。 #8 楼
您可能还想看一下已经回答的问题C#中的字符串比较方法中的差异
评论
我认为这是错误的问题。正确的问题是“这些更正确吗?”还有if(string.Compare(strA,strB,StringComparison.OrdinalIgnoreCase)== 0)或if(val.Equals(“ AStringValue”,StringComparison.OrdinalIgnoreCase)),正确性通常也归因于个人偏见,对此还有更多讨论哪种方法在stackoverflow.com/questions/44288/…上正确?
@asawyer,为什么它会“更正确”而不是“更有效”?
乔恩·斯基特(Jon Skeet)在这里已经回答了这个问题。
我更喜欢Equals,因为它是一行的Ronsell(它在锡罐上说的话)。 ToLowerCase需要阅读上面的行,并结合它们的逻辑来弄清为什么要小写什么。