2015-02-23 36 views
2

我正在编写一个程序,我要检查大约100个短语的16,000个字符串。
我这样做的简单方法有两个for循环:
(导致1,600,000字符串操作)将数组项目与其他数组项目进行比较的高效方法

string[] phrases;  
string[] texts; 

for(int t_count = 0; t_count < 16000; t_count++) 
{ 
    for(int p_count = 0; p_count < 100; p_count++) 
    { 
     Regex pattern = new Regex(phrases[p_count]); 
     if (pattern.IsMatch(texts[t_count])) 
     { 
     //Save phrases[p_count] 
     break; 
     } 
    } 
} 

我认为必须有更多effcient的方式来做到这一点。
欢迎任何建议。

编辑:@ J. Steen 当然,它运行得更快,但同时生产独角兽会非常棒!

+5

效率如何?时间?记忆?独角兽? – 2015-02-23 13:33:52

+1

@ J.Steen独角兽是! – 2015-02-23 13:34:11

+0

如果没有更多细节,我们无法改进。也许你可以在循环中的某处使用纯字符串方法,而不是正则表达式或“break”。但是谁知道? – 2015-02-23 13:35:43

回答

9

开始通过切换循环的顺序 - 而不是编译每个100个正则表达式的16000倍,这将编译它们一次:

for(int p_count = 0; p_count < 100; p_count++) 
{ 
    Regex pattern = new Regex(phrases[p_count]); 
    for(int t_count = 0; t_count < 16000; t_count++) 
    { 
     if (pattern.IsMatch(texts[t_count])) 
     { 
     //Do Something 
     } 
    } 
} 
+1

也许'RegexOptions.Compiled'也会有用,但是你必须确定它。 – Dirk 2015-02-23 13:50:12

+0

@xantos否,http://referencesource.microsoft.com/System/R/71b5945bb883860b.html显示默认值为“无”。 – Dirk 2015-02-23 13:57:40

+0

如果每个不同的正则表达式只构造一次,则关闭RegexOptions.Compiled应该更快,因为编译设置会为构造函数添加初始化时间。 – Kazar 2015-02-23 13:58:58

相关问题