【发布时间】:2018-05-05 18:27:48
【问题描述】:
我有以下有效的代码,但想使用 LINQ(或其他东西)来加快它的速度,以查找目标中是否有任何 Regex 搜索字符串。
List<Regex> Filters = new List<Regex>();
Filters.Add(new Regex("string1", RegexOptions.IgnoreCase));
Filters.Add(new Regex("string2", RegexOptions.Compile));
...
bool found = false
string target = "string which may contain string1 or string2 or neither";
foreach (Regex r in Filters) {
if (r.IsMatch(target)) {
found = true;
break; // get out as soon as found
}
}
if (found) { // do stuff }
当前搜索正在处理的大文件需要很长时间。 有没有办法让 .Any 或 .First 更有效地完成这项工作?
【问题讨论】:
-
您是否应该并行化您的代码 (PLINQ)?
-
Linq 根本不会让你的代码更快,它只是隐藏了复杂性并引入了一些可能导致很多混淆的东西,如果你不熟悉它 - 延迟执行。简而言之:不要为了一些优化而使用 LINQ。话虽如此,您的代码已经尽可能快了,至少在您想使用正则表达式时是如此。
-
这是对正则表达式引擎的低效使用。使用交替将两个正则表达式组合成 1 个正则表达式。
new Regex("string1|string2"); -
Filters.Any(x => x.IsMatch(target)); ??