这是搜索子字符串的最有效方法吗?

Dav*_*ter 4 c# performance

我正在处理一些代码,这些代码返回一个代码来指示它们的用户类型(例如"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)

这是执行此检查的有效方式吗?有更有效的方法吗?

提前致谢!

Jam*_*are 5

纵观对于去编译代码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次迭代:

  • 包含(值) - 耗时130毫秒
  • IndexOf(value,StringComparison.Ordinal) - 耗时128毫秒

所以你可以看到,非常非常接近.再一次,使用更可维护的东西.

更新2:如果您的代码始终是单个char(不是1-char字符串),则IndexOf()更快:

  • 包含(char值) - 耗时94毫秒
  • IndexOf(char值) - 花了16毫秒

如果你知道你的char代码总是一个char,那么使用IndexOf()char参数的速度要快一个数量级.

这是因为Contains(char value)是一个扩展方法IEnumerable<T>而不是第一类方法string.

但是,超过1,000,000次迭代再次~100 ms真的,真的,可以忽略不计.