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

以下两种方法哪一种效率更高?(或许还有第三种更好的选择?)

string val = "AStringValue";


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

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

?

513535 次浏览

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

第一个是正确的,以我之见,也是更有效的,因为第二个“解决方案”实例化了一个新的字符串实例。

我敢说最安全的是使用String.Equals来减少val是null的可能性。

对于这类关于“效率”的问题,我的一般答案几乎总是,哪个版本的代码最易读,是最有效的。

话虽如此,我认为(val.ToLowerCase() == "astringvalue")对大多数人来说是一目了然的。

我所说的效率并不一定是指代码的执行,而是指所讨论的代码的维护和可读性。

如果你在寻找效率,可以使用这个:

string.Equals(val, "astringvalue", StringComparison.OrdinalIgnoreCase)

顺序比较可能比区域性比较快得多。

然而,如果你要对同一个字符串进行很多比较,ToLowerCase可能是更好的选择。

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

.ToLowerCase版本不会更快——它涉及额外的字符串分配 (稍后必须收集),等等

就我个人而言,我会使用

string.Equals(val, "astringvalue",  StringComparison.OrdinalIgnoreCase)

这避免了区域性敏感字符串的所有问题,但结果是避免区域性敏感字符串的所有问题。只有你自己知道这在你的语境中是否合适。

使用string.Equals静态方法避免了valnull的任何问题。

1st更有效(也是最好的选项),因为val.ToLowerCase()创建了一个新对象,因为字符串是不可变的。

你可能还想看看那个已经回答的问题 c#中字符串比较方法的差异 < / p >