2014-04-05 25 views
0

我剛剛發現的Roslyn源代碼,我看到了一個代碼片段看起來是這樣的:在這段代碼中使用do-while循環有什麼意義?

var text = stringBuilder.ToString(); 
int length; 
do 
{ 
    length = text.Length; 
    text = text.Replace("{\r\n\r\n", "{\r\n"); 
} while (text.Length != length); 

它看起來我因爲String.Replace方法,將替換指定字符串的所有出現的新值在一個time.So這個循環執行的第一次,執行更改,然後再進行第二次執行,做什麼都不。然後,它結束。那麼爲什麼要使用loop,而不是僅僅寫了一點:

var text = stringBuilder.ToString(); 
text = text.Replace("{\r\n\r\n", "{\r\n"); 

或者更短:

var text = stringBuilder.ToString().Replace("{\r\n\r\n", "{\r\n"); 

我缺少的東西?

+1

是 - 你錯過了該字符串可以在括號「{」後,包含兩個以上的換行符 - 那就繼續刪除額外的換行符,直到只有一個仍然存在。 – Marwie

+0

我不太喜歡那個代碼,因爲它很難理解。當然,它可能會更快一些,但爲什麼不使用String.Contains(「{\ r \ n」)?我不知道這段代碼的使用情況以及輸入的時間長短,但通常情況下這並不會顯着降低程序的速度。 – jalgames

+0

@ user2241553:你想實現與'String.Contains( 「{\ r \ n」)'究竟是什麼? –

回答

6

假設串有一個開放的大括號後三個空白行:

"{\r\n\r\n\r\n\r\n" 

第一次迭代會產生這樣的:

"{\r\n\r\n\r\n" 

第二會產生這樣的:

"{\r\n\r\n" 

第三種會產生:

"{\r\n" 

每次迭代中刪除一個空行。

+0

我的答案更富有表現力的版本。 –

+0

確實有道理。我不能相信我會錯過:)我會盡快接受這一點。 –

3

是 - 你錯過了該字符串可以在括號「{」後,包含兩個以上的換行符 - 那就繼續刪除額外的換行符,直到只有一個仍然存在。

2

它使用(的一種)遞歸處理一組暴露的替代品,其隨後需要更換以同樣的方式一個新的字符集。