用字符串替换给定索引处的char?

Jas*_*n94 119 c# string

字符串没有ReplaceAt(),我在如何制作一个能满足我需要的体面功能方面有点笨拙.我想CPU的成本很高,但字符串大小很小所以一切都好

Tho*_*que 208

使用StringBuilder:

StringBuilder sb = new StringBuilder(theString);
sb[index] = newChar;
theString = sb.ToString();
Run Code Online (Sandbox Code Playgroud)

  • 我尝试在100k迭代上使用一点基准测试,ToCharArray至少快2倍. (15认同)
  • @Jason94,我不确定这比使用ToCharArray更有效,因为在Jon的回答中,你应该运行测试以查看哪一个更快. (5认同)
  • 啊,Stringbuilder很整洁 (3认同)

Jon*_*eet 80

最简单的办法是这样的:

public static string ReplaceAt(this string input, int index, char newChar)
{
    if (input == null)
    {
        throw new ArgumentNullException("input");
    }
    char[] chars = input.ToCharArray();
    chars[index] = newChar;
    return new string(chars);
}
Run Code Online (Sandbox Code Playgroud)

现在这是一种扩展方法,因此您可以使用:

var foo = "hello".ReplaceAt(2, 'x');
Console.WriteLine(foo); // hexlo
Run Code Online (Sandbox Code Playgroud)

这将是很好的想一些办法,仅需要单个的数据副本来进行,而不是两个在这里,但我不知道的这样做的任何方式.它可能会这样做:

public static string ReplaceAt(this string input, int index, char newChar)
{
    if (input == null)
    {
        throw new ArgumentNullException("input");
    }
    StringBuilder builder = new StringBuilder(input);
    builder[index] = newChar;
    return builder.ToString();
}
Run Code Online (Sandbox Code Playgroud)

...我怀疑这完全取决于您使用的框架版本.

  • +1使其成为扩展方法.正如在接受的答案的注释中以及在其他答案中所提到的,ToCharArray()方法比StringBuilder方法更快.还有一个可能的改进:检查input.Count> index-1 && index> = 0否则在执行chars [index]或builder [index]时会出现异常. (2认同)

Mac*_*iej 25

string s = "ihj";
char[] array = s.ToCharArray();
array[1] = 'p';
s = new string(array);
Run Code Online (Sandbox Code Playgroud)

  • 根据公认答案的评论表明,这种方法的速度是原来的两倍. (3认同)

Pet*_*nov 5

字符串是不可变对象,因此您无法替换字符串中的给定字符。您可以做的是创建一个替换给定字符的新字符串。

但是如果你要创建一个新的字符串,为什么不使用 StringBuilder:

string s = "abc";
StringBuilder sb = new StringBuilder(s);
sb[1] = 'x';
string newS = sb.ToString();

//newS = "axc";
Run Code Online (Sandbox Code Playgroud)


hor*_*rgh 5

我突然需要完成这项任务并找到了这个主题.所以,这是我的linq风格变体:

public static class Extensions
{
    public static string ReplaceAt(this string value, int index, char newchar)
    {
        if (value.Length <= index)
            return value;
        else
            return string.Concat(value.Select((c, i) => i == index ? newchar : c));
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,例如:

string instr = "Replace$dollar";
string outstr = instr.ReplaceAt(7, ' ');
Run Code Online (Sandbox Code Playgroud)

最后我需要使用.Net Framework 2,所以我使用了StringBuilder类变体.