2013-01-19 69 views
1

刪除號碼時,我有一個包含以下代碼的函數:性能問題,從大的字符串

Text = Text.Where(c => !Char.IsDigit(c)).Aggregate<char, string>(null, (current, c) => current + c); 

,但它是相當緩慢。無論如何,我可以加快速度嗎?

+0

在這裏你去朋友:'文本= 「」;' – ChaosPandion

+0

是你使用'Char.IsDigit'是因爲你需要處理國際數字還是因爲你不知道更好? – Esailija

+0

該字符串只包含整數還是小數? – Steve

回答

8

試試這個正則表達式:

Text = Regex.Replace(Text, @"\d+", ""); 

\d+不僅僅是\d,因爲它一次刪除多個連續數字更高效。

3

是的,你可以使用Regex.Replace

Text = Regex.Replace(Text, "\\d", ""); 

正則表達式一個單一的數字相匹配。 Regex.ReplaceText字符串中的每個匹配項替換爲空字符串""

+0

@TimPietzcker我不確定這兩者的相對效率,因爲它很大程度上取決於'Replace'函數的實現。 – dasblinkenlight

+0

如果他不需要處理國際數字,'[0-9]'(10個字符)應該更快,因爲它覆蓋的字符範圍要比'\\ d'小(460個字符) – Esailija

+0

@Esailija使(幾乎)沒有區別。普通表達式引擎中的字符類查找是高度優化的,大約需要O(1),即它獨立於字符類中的字符數。其他一切都會使正則表達式先驗無法使用。 –

1

試用Regex.Replace;

在指定的輸入字符串中,用指定的替換字符串替換與常規 表達式模式匹配的字符串。

Regex.Replace(Text, "\\d+", ""); 

這裏是一個DEMO

2

所有這些連接可能會殺死你。最簡單的/最好的可能是一個正則表達式:

Text = Regex.Replace(Text, "\\d", ""); 

或者你可以嘗試做只有一個新的字符串實例:

Text = new string(Text.Where(c => !Char.IsDigit(c)).ToArray())