C# 比较两个字符串,忽略C中的大小写#

C# 比较两个字符串,忽略C中的大小写#,c#,string,comparison,equals,C#,String,Comparison,Equals,以下哪两个更有效?(或者还有第三种更好的选择吗?) 或 前者是最快的。事实证明,val是不可变的,因此使用string.ToLowerCase()创建了一个新的字符串对象,而不仅仅是与字符串比较器直接比较。如果一秒钟要创建很多次,那么创建一个新的字符串对象的成本可能会很高。第一个是正确的,效率越高,因为第二个“解决方案”实例化了一个新的字符串实例。我敢说,最安全的方法是使用val来减少val为空的可能性。对于这种关于“效率”的问题,我的一般答案几乎总是,哪种版本的代码可读性最好,哪种版本的效率最

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


前者是最快的。事实证明,
val
是不可变的,因此使用string.ToLowerCase()创建了一个新的字符串对象,而不仅仅是与字符串比较器直接比较。如果一秒钟要创建很多次,那么创建一个新的字符串对象的成本可能会很高。

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

我敢说,最安全的方法是使用val来减少val为空的可能性。对于这种关于“效率”的问题,我的一般答案几乎总是,哪种版本的代码可读性最好,哪种版本的效率最高

尽管如此,我认为大多数人一眼就能理解
(val.ToLowerCase()=“astringvalue”)


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

如果您希望提高效率,请使用以下方法:

string.Equals(val, "astringvalue", StringComparison.OrdinalIgnoreCase)
顺序比较比区域性比较快得多

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


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

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

就我个人而言,我会使用

string.Equals(val, "astringvalue",  StringComparison.OrdinalIgnoreCase)
这避免了区域性敏感字符串的所有问题,但因此避免了区域性敏感字符串的所有问题。只有你知道这在你的上下文中是否合适


使用
string.Equals
静态方法可以避免
val
null
的任何问题,因为
val.ToLowerCase()
会创建一个新对象,因为字符串是不可变的

您可能还想看看已经回答的问题

我认为这是个错误的问题。正确的问题是“哪一个更正确?”还有if(string.Compare(strA,strB,StringComparison.OrdinalIgnoreCase)==0)或if(val.Equals(“AStringValue”,StringComparison.OrdinalIgnoreCase)),正确性通常也取决于个人的表现,在@asawyer有更多关于哪种方法正确的讨论,为什么它会“更正确”而不是“更有效”?Jon Skeet已经回答了这个问题。我更喜欢在一行中使用Equals,因为它是Ronsell(它按照锡上所说的做)。ToLowerCase需要阅读上面的一行,结合它们的逻辑来找出为什么要使用小写。你能告诉我们为什么要使用StringComparison.OrdinalIgnoreCase而不是StringComparison.InvariantCultureIgnoreCase吗?@mq面食-这当然取决于目的,但是“这在比较以编程方式生成的字符串或比较不区分大小写的资源(如路径和文件名)时最合适。“-另外,调用静态方法有点快。当调用静态方法时,我总是使用类名称,如
String.Equals
和大写字母'S',或者例如
Int32.Parse
而不是
int.Parse
。关于
OrdinalIgnoreCase
的好提示。谢谢。如果对同一个字符串进行大量比较,为什么ToLowerCase是更好的选择?通过这样做,您每次都必须“降低”另一个字符串,这可能会很昂贵。@FrederikGheysels我猜Sven建议您存储tolower()的结果Microsoft似乎建议在多重比较场景中使用ToUpper不变量而不是ToLower。在任何一种情况下,它都可能是一个不变的方法。@FrederikHeysels是正确的,但StringComparer.OrdinalIgnoreCase的文档说明了这一点“OrdinalIgnoreCase属性返回的StringComparer将要比较的字符串中的字符视为使用不变区域性的约定将其转换为大写,然后执行独立于语言的简单字节比较。”(请参阅)。如果您可以存储比较左侧的结果,则只需在右侧进行工作。但除了效率之外,我看到第二种解决方案的使用率要高得多,因为它有效、更简短、更易于键入,并且具有易于记忆的直接格式。“StringComparison.InvariantCultureIgnoreCase”“…真的吗?@BengalTigger至少,第二个例子应该是使用
ToLowerInvariant()
。但是,第一个实例很可能实例化两个新的字符串实例,因此不一定更快。
string.Equals(val, "astringvalue", StringComparison.OrdinalIgnoreCase)
string.Equals(val, "astringvalue",  StringComparison.OrdinalIgnoreCase)