以下两种方案哪个更有效率?(或者也许有第三个选项更好?)
string val = "AStringValue";
if (val.Equals("astringvalue", StringComparison.InvariantCultureIgnoreCase))
ORif (val.ToLowerCase() == "astringvalue")
?
以下两种方案哪个更有效率?(或者也许有第三个选项更好?)
string val = "AStringValue";
if (val.Equals("astringvalue", StringComparison.InvariantCultureIgnoreCase))
ORif (val.ToLowerCase() == "astringvalue")
?
如果你想要更高的效率,请使用这个方法:
string.Equals(val, "astringvalue", StringComparison.OrdinalIgnoreCase)
序数比较可以比区分文化的比较更快。
但是,如果您对同一字符串进行大量比较,ToLowerCase
可能是更好的选择。
与任何性能优化一样: 先测量,再决定!
String.Equals
(大写的'S')或者Int32.Parse
而不是int.Parse
。对于OrdinalIgnoreCase
的提示很有帮助。谢谢。 - orad第一个是正确的,也是在我看来更加有效的,因为第二种“解决方案”实例化了一个新的字符串实例。
ToLowerInvariant()
。但是,第一个示例可能会实例化两个新的字符串实例,因此不一定更快。 - jpaugh.ToLowerCase
的版本不会更快 - 它涉及到额外的字符串分配(必须稍后收集),等等。
个人而言,我会使用
string.Equals(val, "astringvalue", StringComparison.OrdinalIgnoreCase)
这样做可以避免与特定语言文化相关的字符串问题,但作为后果它也避免了所有与此相关的问题。只有您知道在您的情况下是否可以接受这种影响。对于关于“效率”的这类问题,我的一般回答几乎总是:哪个版本的代码最易读,哪个版本就最有效率。
话虽如此,我认为(val.ToLowerCase() == "astringvalue")
对于绝大多数人来说一眼就能理解。
我所指的效率不一定在于代码的执行,而更多地在于代码的维护和整体可读性。
Equals
和StringComparison.OrdinalIgnoreCase
一起使用既易读又更少出错,特别是对于像上面示例中的字符串字面量。您甚至可以创建一个扩展方法EqualsIgnoreCase
,它内部决定使用哪个StringComparison
。 - Lukas Körfer前者速度最快。原来val
是不可变的,所以使用String.ToLowerCase()创建了一个新的字符串对象,而不是直接使用字符串比较器进行比较。如果每秒钟这样做多次,创建新的字符串对象可能会很昂贵。
第一种方法更高效(也是最佳选项),因为val.ToLowerCase()
会创建一个新的对象,因为字符串是不可变的。