Comparing two strings, ignoring case in C#
Possible Duplicate:
What is difference between different string compare methods
以下哪一个更有效?(或者还有更好的第三种选择吗?)
1 2 3
| string val ="AStringValue";
if (val.Equals("astringvalue", StringComparison.InvariantCultureIgnoreCase)) |
或
1
| if (val.ToLowerCase() =="astringvalue") |
?
- 我想那是个错误的问题。正确的问题是"这些是哪个更正确?"
- 还有if(string.compare(stra,strb,stringcomparison.ordinalignorecase)==0)或if(val.equals("astringvalue",stringcomparison.ordinalignorecase)),正确性通常也取决于个人的表现,在stackoverflow.com/questions/44288/&hellip上,有更多关于哪种方法正确的讨论;
- @Asawyer,为什么它"更正确"而不是"更有效"?
- 乔恩·斯基特已经在这里回答了这个问题。
如果你在寻找效率,请使用:
1
| string.Equals(val,"astringvalue", StringComparison.OrdinalIgnoreCase) |
顺序比较比文化感知的比较快得多。
但是,如果您对同一字符串进行了大量比较,那么ToLowerCase可能是更好的选择。
与任何性能优化一样:测量它,然后决定!
- 调用静态方法时,我总是使用像String.Equals这样的类名和大写's',或者例如Int32.Parse而不是int.Parse。很好的提示。谢谢.
- 为什么在比较同一个字符串时,ToLowercase会是更好的选择?这样做的话,你每次都得"给"另一根绳子,这可能很贵。
- @Frederikheysels我猜想sven建议您将tolower()的结果存储在一个变量中,然后对其执行每个比较。
- 微软似乎建议您使用toupperinvariant而不是tolower-msdn.microsoft.com/en-us/library/dd465121.aspx-来进行多重比较。在这两种情况下,它都可能是一个不变量方法。
- @pwdst:这意味着您必须对要与存储变量进行比较的其他字符串执行tolower。
- @FrederikHeysels正确,但StringComparer.ordinalIgnoreCase的文档中指出"ordinalIgnoreCase属性返回的StringComparer将字符串中的字符视为使用不变区域性的约定将它们转换为大写,然后执行独立的简单字节比较。"语言的ent。"(请参阅msdn.microsoft.com/en-us/library/…)。如果您可以存储比较左侧的结果,那么只需要在右侧完成工作。
- @frederikheysels因此,对于许多比较,在比较值上存储toupperInvariant可能比对每个比较使用ordinalAlignore调用效果更好。无论哪种情况,您都应该使用string.equals并显式地声明比较。一如既往,如果有疑问-测量。
第一个是正确的,imho是更有效的,因为第二个"解决方案"实例化了一个新的字符串实例。
- 但是除了效率,我看到第二个解决方案的使用要多得多,因为它有效、更短、更容易输入,并且具有易于记忆的直接格式。"StringComparison.InvariantCultureIgnoreCase"…真的吗?
- @至少孟加拉虎,第二个例子应该是使用ToLowerInvariant()。但是,第一个实例可以很好地实例化两个新的字符串实例,因此不一定更快。
.ToLowerCase版本不会更快,它需要额外的字符串分配(以后必须收集)等。
我个人会用
1
| string.Equals(val,"astringvalue", StringComparison.OrdinalIgnoreCase) |
这避免了文化敏感字符串的所有问题,但因此它避免了文化敏感字符串的所有问题。只有你知道在你的语境中这是否合适。
使用String.Equals静态方法可以避免val是null的任何问题。
- 您能告诉我们为什么使用StringComparison.OrdinalIgnoreCase而不是StringComparison.InvariantCultureIgnoreCase吗?
- @mqpasta—当然,它取决于用途,但是msdn.microsoft.com/en us/library/…"当比较以编程方式生成的字符串或比较不区分大小写的资源(如路径和文件名)时,这是最合适的。"—另外,它速度稍微快一点。
对于这种关于"效率"的问题,我的一般答案几乎总是,代码的任何版本都是可读性最高的,也是最有效的。
尽管如此,我认为大多数人一眼就能理解(val.ToLowerCase() =="astringvalue")。
我提到的效率不是执行代码所必需的,而是有关代码的维护和一般的可读性。
我敢打赌,最安全的方法是使用String.Equals来减轻val是null的可能性。
前者是最快的。原来val是不可变的,所以用string.tolowercase()创建了一个新的string对象,而不仅仅是直接与字符串比较器进行比较。如果您一秒钟要做很多次,那么创建一个新的字符串对象可能会很昂贵。
你也可以看看已经回答的问题。C中字符串比较方法的差异#
第一个更有效(也是最好的选择),因为val.ToLowerCase()创建了一个新对象,因为字符串是不可变的。