.net-4.0 - 什么时候应该使用 Regex 而不是 String.IndexOf()?或者 String.Contains()?

标签 .net-4.0 string-comparison

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

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

最佳答案

它是可变的。比较性能是输入数据、用于比较的区域性、区分大小写和 CompareOptions 的复杂函数。 Regex 对象的实例化成本更高(除非它位于 Regex 缓存中),因此,如果您进行大量一次性比较,那么它的使用效果并不是很好,我发现它通常是比 IndexOf() 慢,但是 YMMV。

请记住,在使用 Contains/IndexOf 时,用户/线程运行所在的区域性将决定如何进行比较。这会对性能产生重大影响。并非所有文化都那么快。

不变文化是一种非常快速的文化。如果直接使用 CompareInfo,而不是使用 String.IndexOf(),它的速度仍然会更快。

CultureInfo.InvariantCulture.CompareInfo.IndexOf(..)

对做出正确选择有信心的唯一方法是进行基准测试。也就是说,除非您要转换许多兆字节的字符串,否则它不会对任何人产生重要的影响。正如 ChrisF 之前所说,在这种情况下,请关注可读/可维护的代码。

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

关于.net-4.0 - 什么时候应该使用 Regex 而不是 String.IndexOf()?或者 String.Contains()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3160172/

相关文章:

.net - BlockingCollection.Dispose实际上做什么?

c# - .NET 4.0 比早期版本慢,这是真的吗?

c# - 在哪里可以找到查看内存中对象的工具?

c# - 事件触发事件

c# - 在这种情况下如何正确使用 .ToLower() ?

c# - 基于字符串的不变量 IComparer<string>

android - 如何比较android中的文本UTF-8?

ios - 在NSMutableArray中快速找到子字符串

c# - 带有 Ninject 的 WPF 应用程序

java - 简单的 string.equals 工作不正确 - Java