在C#中编辑字符串中的字符

Rob*_*boy 13 .net c# c++ string

在C#中编辑字符串中字符的最简洁方法是什么?

C++中C#的等价物是什么:

std::string myString = "boom";
myString[0] = "d";
Run Code Online (Sandbox Code Playgroud)

Bri*_*ndy 30

StringBuilder改用.

字符串是不可变的,如MSDN所述:

字符串是不可变的 - 在创建对象后,字符串对象的内容无法更改,尽管语法使其看起来好像可以执行此操作.

所以你想要这样的东西:

 StringBuilder sb = new StringBuilder("Bello World!");
 sb[0] = 'H';
 string str = sb.ToString();
Run Code Online (Sandbox Code Playgroud)

  • 得到了我的upvote,因为它是唯一的另一个答案,它提供了一种灵活的方式来实现他想要的,正确的,没有昂贵或过于复杂的结构. (2认同)

hem*_*emp 15

决定按照两种最规范的方法来判断我的感受,加上一个我没有代表的方式; 这是我发现的(发布版本):

ReplaceAtChars: 86ms
ReplaceAtSubstring: 258ms
ReplaceAtStringBuilder: 161ms

显然,Char数组方法是运行时最佳优化的.这实际上表明当前的主要答案(StringBuilder)可能不是最好的答案.

这是我用过的测试:

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("ReplaceAtChars: " + new Stopwatch().Time(() => "test".ReplaceAtChars(1, 'E').ReplaceAtChars(3, 'T'), 1000000) + "ms");
        Console.WriteLine("ReplaceAtSubstring: " + new Stopwatch().Time(() => "test".ReplaceAtSubstring(1, 'E').ReplaceAtSubstring(3, 'T'), 1000000) + "ms");
        Console.WriteLine("ReplaceAtStringBuilder: " + new Stopwatch().Time(() => "test".ReplaceAtStringBuilder(1, 'E').ReplaceAtStringBuilder(3, 'T'), 1000000) + "ms");
    }
}

public static class ReplaceAtExtensions
{
    public static string ReplaceAtChars(this string source, int index, char replacement)
    {
        var temp = source.ToCharArray();
        temp[index] = replacement;
        return new String(temp);
    }

    public static string ReplaceAtStringBuilder(this string source, int index, char replacement)
    {
        var sb = new StringBuilder(source);
        sb[index] = replacement;
        return sb.ToString();
    }

    public static string ReplaceAtSubstring(this string source, int index, char replacement)
    {
        return source.Substring(0, index) + replacement + source.Substring(index + 1);
    }
}

public static class StopwatchExtensions
{
    public static long Time(this Stopwatch sw, Action action, int iterations)
    {
        sw.Reset();
        sw.Start();
        for (int i = 0; i < iterations; i++)
        {
            action();
        }
        sw.Stop();

        return sw.ElapsedMilliseconds;
    }
}
Run Code Online (Sandbox Code Playgroud)


Joe*_*orn 8

.Net中的字符串是不可变的.这意味着你无法编辑它们.你所能做的就是创造新的.你必须做这样的事情:

string myString = "boom";
myString = "d" + myString.Substring(1);
Run Code Online (Sandbox Code Playgroud)

  • 如果他必须在更长的字符串中编辑多个字符,这将很快变得乏味. (2认同)

cor*_*iKa 8

字符串是不可变的,所以你不能只改变它.

您可以从字符串中获取char [],进行更改,并从更改的数组中创建一个新字符串.

您可以使用替换之类的东西,尽管它们不会让您像C一样控制per-char基础.他们还会在每次更改时创建一个新字符串,其中char []样式允许您进行所有更改,然后从中创建一个新字符串.


Jus*_*ner 5

你不能因为字符串是不可变的.

你总是可以推出自己的扩展方法来做类似的事情:

public static string ReplaceAtIndex(this string original, 
    int index, char character)
{
    char[] temp = original.ToCharArray();
    temp[index] = character;
    return new String(temp);
}
Run Code Online (Sandbox Code Playgroud)

称之为:

string newString = myString.ReplaceAtIndex(0, 'd');
Run Code Online (Sandbox Code Playgroud)

  • @David Relihan - 它叫做扩展方法.你可以在这里阅读更多关于它们的信息:http://msdn.microsoft.com/en-us/library/bb383977.aspx (3认同)
  • 每次调用该函数都会创建3个临时字符串.这并不可怕,但如果你需要多次这样做,那将会非常昂贵. (2认同)