在C#中向字符串中插入字符

4

在C#中,如何在字符串中的每个字符之间插入一个字符?

例如:"Hello Sunshine"将变为"H.e.l.l.o. .S.u.n.s.h.i.n.e"

在C#中,最高效、最快的方法是什么?

5个回答

6

怎么样:

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

这个可以隐藏大部分复杂性,并会在内部使用StringBuilder


1
我认为你漏掉了最后的 . - svick
@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 sb = new StringBuilder(s.Length * 2);来提高效率。 - Quintin Robinson
1
对于与示例大小相同的问题,使用StringBuilder是不必要而且繁琐的。 - H H

1
你关心大字符串的性能吗?
var result = string.Join(".", str.Select(c => c.ToString());

2
这将缺少最后的 . - Kirk Woll
@Kirik,是的,我没有提到那个。 - Snowbear

1

这是我的建议,我知道它看起来并不太性感,但我相信它比使用Select、Join等所有方法更快(对于示例字符串快3倍),并且需要精确的内存量 :-)

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。


0
Mark的回答可能更易读。但我总是喜欢这种解决方案:
string.Join("", "Hello Sunshine".Select(x => x + "."))

然后是 string.Concat。我们平手了 :) - Snowbear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接