2011-11-18 86 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.