我正在处理一些代码,这些代码返回一个代码来指示它们的用户类型(例如"A","B","C","D"等).每个代码对应于特定的角色和/或范围(例如,跨整个应用程序或仅针对正在处理的对象).
在我正在查看的一些代码中,我看到调用以检查用户的代码是否是其中之一,以便允许它们执行某些操作.所以我看到如下调用:
//"B" would come from the database
string userCode = "B";
//some more work...
//if the user's code is either A or C...
if("AC".IndexOf(userCode) >= 0) {
//do work that allows the user to progress
} else {
//notify user they can't do this operation
}
Run Code Online (Sandbox Code Playgroud)
这是执行此检查的有效方式吗?有更有效的方法吗?
提前致谢!
纵观对于去编译代码Contains()
,它只是要求IndexOf()
有StringComparison.Ordinal
,所以我会说IndexOf()
是最有效的(由一个非常小的头发)我,如果以同样的方式(序)使用,因为它少了一个方法调用,但Contains()
更可读,因此更易于维护......
public bool Contains(string value)
{
return (this.IndexOf(value, StringComparison.Ordinal) >= 0);
}
Run Code Online (Sandbox Code Playgroud)
就像在所有事情中一样,我会选择更具可读性和可维护性的东西,然后分解性能.当你知道此时存在瓶颈时,才进行微优化.
更新:超过1,000,000次迭代:
所以你可以看到,非常非常接近.再一次,使用更可维护的东西.
更新2:如果您的代码始终是单个char(不是1-char字符串),则IndexOf()更快:
如果你知道你的char代码总是一个char,那么使用IndexOf()
char参数的速度要快一个数量级.
这是因为Contains(char value)
是一个扩展方法IEnumerable<T>
而不是第一类方法string
.
但是,超过1,000,000次迭代再次~100 ms真的,真的,可以忽略不计.