何时应该在String.IndexOf()上使用Regex?或String.Contains()?

时间:2010-07-01 17:24:13

标签: .net-4.0 string-comparison

我现在正在使用.NET 4.0开发我的第一个项目,它需要几千个字符串比较(我正在搜索目录,有时甚至是某些文件的整个驱动器)。在大多数情况下,字符串很短,因为我只查看文件路径,所以我刚刚使用String.Contains()来查看文件路径字符串是否包含我的针字符串。

我想知道,Regex会是一个更好的主意吗? Regex在什么时候比标准字符串比较更快?它是基于被比较的字符串的长度还是被比较的字符串数量?

4 个答案:

答案 0 :(得分:2)

如果您的搜索表达式很简单,那么我认为值得转移到正则表达式 - 无论您在编码和阅读它们方面有多好,它都会花费您更多时间来理解代码(或者更重要的是,其他人)在6个月的时间内再次看一遍。

如果速度的改进只是边缘保持不变,那么可读性和可维护性更强。

答案 1 :(得分:2)

这是变数。比较性能是输入数据的复杂函数,用于比较的文化,区分大小写和CompareOptions。 Regex对象实例化的成本更高(除非它在Regex缓存中),所以如果你进行了大量的一次性比较,那么使用它并不是很好,而且我发现它通常比{更慢} {1}},但是YMMV。

请记住,使用Contains / IndexOf时,运行用户/线程的文化将决定比较的完成方式。这可能会对性能产生重大影响。并非所有文化都如此快。

不变文化是一种非常快速的文化。如果您直接使用IndexOf(),而不是CompareInfo,那么它会更快一些。

String.IndexOf()

对做出正确选择有信心的唯一方法是进行基准测试。也就是说,除非你转移到数兆字节的字符串,否则对任何人都没有影响。正如ChrisF先前所说,在这种情况下,请关注可读/可维护代码。

这是一篇关于充分利用正则表达式的好文章: Optimizing Regular Expression Performance

答案 2 :(得分:1)

我只是猜测,但我怀疑对于简单的子字符串搜索,String.Contains()String.IndexOf()和正则表达式之间的性能差别不大(如果有的话,我猜这个正则表达式永远不会更快,但可能会以微不足道的速度变慢。)

你不应该考虑转移到正则表达式,除非你的要求是(或变成)你需要匹配比子串更复杂的东西。

答案 3 :(得分:0)

在.Net 4.0中,String.IndexOf调用存在问题,请参阅修补程序2467309,它可以帮助您确定答案。