在C#中给定以下字符串,我将如何在字符串中的每个字符之间插入一个字符?在C#中插入字符到字符串中#
例如: "Hello Sunshine"
将成为 "H.e.l.l.o. .S.u.n.s.h.i.n.e"
什么是C#这样做的最有效,最快的方法是什么?
在C#中给定以下字符串,我将如何在字符串中的每个字符之间插入一个字符?在C#中插入字符到字符串中#
例如: "Hello Sunshine"
将成为 "H.e.l.l.o. .S.u.n.s.h.i.n.e"
什么是C#这样做的最有效,最快的方法是什么?
如何:
string result = string.Join(".", someString.AsEnumerable());
这隐藏了大部分的复杂性,并且将使用StringBuilder
内部。
如果你想每一个字符后点使用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 - 可以通过做'StringBuilder的某人=新的StringBuilder提高效率(s.Length * 2);' –
好主意。更新。 –
对于与示例相同大小的问题,StringBuilder是不必要和繁琐的。 –
你关心大字符串的性能吗?
var result = string.Join(".", str.Select(c => c.ToString());
这将会丢失最后的'.'。 –
@Kirik,是的,没有提到 – Snowbear
马克的答案可能更具可读性。但我一直喜欢这种类型的解决方案:
string.Join("", "Hello Sunshine".Select(x => x + "."))
然后'string.Concat'。我们扯平了 :) – Snowbear
这是我的建议,我知道这并不看起来超级性感,但我相信它的速度更快(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.
我想你错过了最后的'.'。 – svick
@svick:我这样做 - 但是然后再次要求是模糊的 - 文字说“在每个字符之间”,但示例在最后字符后显示点 – BrokenGlass