2010-10-19 173 views
2

我有全局聲明的字符串變量。我必須根據用戶輸入動態地將一個子字符串附加到這個字符串。爲此,我使用str = str + substring;字符串操作

在這種情況下,str中的字符串沒有意義的句子最後即,有之間沒有空格words.to讓它感覺到我用下面的語句代替,

海峽= STR +」「+子;或者str = str + substring +「」;

在這裏,每次我必須追加額外的空間到子串,然後再附加到主串,需要額外的字符串處理。

任何人都可以幫助我做到這一點嗎?

回答

6

這取決於你多久做一次。如果這是間歇性的(或者實際上非常多 - 除了緊密的循環之外的任何事情),那麼就忘記它;你有什麼是好的。 當然偶爾會產生一個額外的字符串(合併子字符串/空格),但它會在第0代收集;非常便宜。

如果你這樣做是積極(在一個循環等),然後用StringBuilder代替:

// declaration 
StringBuilder sb = new StringBuilder(); 
... 
// composition 
sb.Append(' ').Append(substring); 
... 
// obtaining the string 
string s = sb.ToString(); 

最後一個(無關)點 - 再「全球」 - 如果你的意思是static,你如果您有多個線程可能想要同步訪問。

+1

如果你只是偶爾連接幾個字符串,由於構建它的代價,StringBuilder可能會過度殺傷。過去習慣於使用字符串構建器來連接字符串,以避免由於必須完成的字符串複製而導致的最壞情況的二次複雜性,但是更新的C#編譯器顯然變得足夠聰明,可以將字符串連接鏈變成String.Concat調用使整個操作在線性時間內完成。 – Stewart 2010-10-19 06:32:45

+1

@斯特沃特 - 長久以來一直如此,但只適用於單一的陳述;此外,我已經在這裏強調了兩種不同的場景(基於頻率) – 2010-10-19 06:43:45

+0

哦,是的 - 我沒有正確閱讀第一句話。感謝您的確認。我認爲這是值得說明的。在很多地方,仍然認爲應該避免字符串連接,以至於在任何地方都可以使用StringBuilder,即使StringBuilder可能要貴得多。正如你所說,即使一段時間以來它一直沒有成立,但二次複雜性的原因總是被引用。 – Stewart 2010-10-19 07:43:57

3

你想要達到什麼目的?你可以存儲詞語列表

List<string> words = new List<string>(); 
... 
words.Add(str); 

然後延遲字符串操作,直到在最後(即添加單詞之間的空格)。這樣,您即將進行的操作只是添加到列表中,您可以在最後執行所有複雜的處理(無論它是什麼)。

+0

(+1)。在這種情況下,我們可以使用類似'String str = words.Aggregate((X1,X2)=> X1 +「」+ X2)的聚集函數來構建最終的'string';' – 2010-10-19 05:38:02

+0

@Pramodh:我想是這樣,但爲什麼我們想要? – 2010-10-19 05:59:34

+0

@ Steven Sudit:'因爲這裏mrnye將字符串添加到列表中。所以這個列表將會包含'str','Substring1','substring2' ....但是Nanda需要一個單獨的字符串(據我所知) – 2010-10-19 06:03:17

0

@南達:在你的情況下,你應該使用字符串生成器。

StringBuilder data = new StringBuilder(); 
data.AppendFormat(" {0}", substring); 
+0

如果你關心性能,你應該避免這種情況。你的代碼必須在運行時解析格式字符串,這有成本。傑米和馬克的答案會比這更快。 – Stewart 2010-10-19 06:29:09

1

如果你是,你稍微靚起來的代碼做很少能這樣做:

str += " " + substring; 

否則,我會與南大的解決方案去。