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

string val = "AStringValue";

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


OR

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




评论

我认为这是错误的问题。正确的问题是“这些更正确吗?”

还有if(string.Compare(strA,strB,StringComparison.OrdinalIgnoreCase)== 0)或if(val.Equals(“ AStringValue”,StringComparison.OrdinalIgnoreCase)),正确性通常也归因于个人偏见,对此还有更多讨论哪种方法在stackoverflow.com/questions/44288/…上正确?

@asawyer,为什么它会“更正确”而不是“更有效”?

乔恩·斯基特(Jon Skeet)在这里已经回答了这个问题。

我更喜欢Equals,因为它是一行的Ronsell(它在锡罐上说的话)。 ToLowerCase需要阅读上面的行,并结合它们的逻辑来弄清为什么要小写什么。

#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静态方法可以避免valnull的任何问题。

评论


您能告诉我们为什么要使用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#中的字符串比较方法中的差异