2011-11-18 85 views
3

在C#中給定以下字符串,我將如何在字符串中的每個字符之間插入一個字符?在C#中插入字符到字符串中#

例如: "Hello Sunshine" 將成爲 "H.e.l.l.o. .S.u.n.s.h.i.n.e"

什麼是C#這樣做的最有效,最快的方法是什麼?

回答

5

如何:

string result = string.Join(".", someString.AsEnumerable()); 

這隱藏了大部分的複雜性,並且將使用StringBuilder內部。

+1

我想你錯過了最後的'.'。 – svick

+0

@svick:我這樣做 - 但是然後再次要求是模糊的 - 文字說「在每個字符之間」,但示例在最後字符後顯示點 – BrokenGlass

5

如果你想每一個字符後點使用StringBuilder

StringBuilder sb = new StringBuilder(s.Length * 2); 
foreach (char c in s) { 
    sb.Append(c); 
    sb.Append('.'); 
} 
string result = sb.ToString(); 

如果你不希望尾隨點,然後在.NET 4.0中,你可以使用string.Join

string result = string.Join(".", (IEnumerable<char>)s); 

在.NET 3.5和較舊的第二個參數應該是一個數組,這意味着你將不得不暫時創建一個數組,因此最有可能是更快地使用上面所示的StringBuilder解決方案和治療的第一或最後一個索引作爲特例。

注意:通常您不需要最高效的解決方案,只需要一個足夠快的解決方案。如果一個稍微慢一點但簡單得多的解決方案就足夠滿足您的需求,那就用它來代替不必要的性能優化。

+5

+1 - 可以通過做'StringBuilder的某人=新的StringBuilder提高效率(s.Length * 2);' –

+0

好主意。更新。 –

+1

對於與示例相同大小的問題,StringBuilder是不必要和繁瑣的。 –

1

你關心大字符串的性能嗎?

var result = string.Join(".", str.Select(c => c.ToString()); 
+2

這將會丟失最後的'.'。 –

+0

@Kirik,是的,沒有提到 – Snowbear

0

馬克的答案可能更具可讀性。但我一直喜歡這種類型的解決方案:

string.Join("", "Hello Sunshine".Select(x => x + ".")) 
+0

然後'string.Concat'。我們扯平了 :) – Snowbear

1

這是我的建議,我知道這並不看起來超級性感,但我相信它的速度更快(3X的樣本串快),需要的內存的具體金額比使用選擇,加入了所有的人,和所有爵士樂:-)

static string ConvertString(string s) 
{ 
    char[] newS = new char[s.Length * 2 + 1]; 
    int i = 0; 
    do 
    { 
     newS[i] = s[i/2]; 
     if (i == (s.Length * 2 - 2)) 
      break; 

     i++; 
     newS[i] = '.'; 
     i++; 
    } 
    while (true); 
    return new string(newS); 
} 

再加上它不需要框架4.