在C#中给出以下字符串,如何在字符串中的每个字符之间插入一个字符?
例如:
"Hello Sunshine"
会成为
"H.e.l.l.o. .S.u.n.s.h.i.n.e"
在C#中执行此操作的最有效,最快捷的方法是什么?
答案 0 :(得分: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
解决方案并对其进行处理。最后一个索引作为特例。
注意:通常您不需要最有效的解决方案,只需要一个足够快的解决方案。如果一个稍慢但更简单的解决方案足以满足您的需求,请使用它而不是不必要地优化性能。
答案 1 :(得分:5)
怎么样:
string result = string.Join(".", someString.AsEnumerable());
这隐藏了大部分复杂性,并将在内部使用StringBuilder
。
答案 2 :(得分:1)
你关心大字符串的表现吗?
var result = string.Join(".", str.Select(c => c.ToString());
答案 3 :(得分:1)
这是我的命题,我知道它看起来并不超级性感,但我相信它更快(样本字符串快3倍)并且需要的内存数量比使用Select,Join和所有爵士乐的所有内存要多: - )
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);
}
另外,它不需要Framework 4。
答案 4 :(得分:0)
马克的回答可能更具可读性。但我总是喜欢这种解决方案:
string.Join("", "Hello Sunshine".Select(x => x + "."))