2015-02-23 47 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

相關問題