如何更改字符串中的1个字符?

Vas*_*sya 39 .net c# string

我有这个代码:

string str = "valta is the best place in the World";
Run Code Online (Sandbox Code Playgroud)

我需要更换第一个符号.当我尝试这个:

str[0] = 'M';
Run Code Online (Sandbox Code Playgroud)

我收到了一个错误.我怎样才能做到这一点?

Kev*_*ice 49

字符串是不可变的,这意味着您无法更改字符.相反,您创建新的字符串.

你问的问题可以通过几种方式完成.最合适的解决方案将根据您对原始字符串所做更改的性质而有所不同.你只改变一个角色吗?你需要插入/删除/追加?

以下是从现有字符串创建新字符串的几种方法,但具有不同的第一个字符:

str = 'M' + str.Remove(0, 1);

str = 'M' + str.Substring(1);
Run Code Online (Sandbox Code Playgroud)

在上面,新字符串被分配给原始变量str.

我想补充一点,其他人展示的答案StringBuilder也非常合适.我不会实例化StringBuilder更改一个字符,但如果需要进行许多更改,StringBuilder则比我在流程中创建临时新字符串的示例更好的解决方案.StringBuilder提供允许许多更改和/或追加操作的可变对象.完成更改后,将StringBuilder使用.ToString()方法创建不可变字符串.您可以继续对StringBuilder对象进行更改,并根据需要使用创建更多新字符串.ToString().


Chu*_*ris 38

我建议您使用StringBuilder类,然后根据需要将其解析为字符串.

System.Text.StringBuilder strBuilder = new System.Text.StringBuilder("valta is the best place in the World");
strBuilder[0] = 'M';
string str=strBuilder.ToString();
Run Code Online (Sandbox Code Playgroud)

你不能用这种方式改变字符串的字符,因为在C#中字符串不是动态的并且是不可变的,它的字符是只读的.为了确保它在尝试使用字符串的方法,例如,如果你这样做str.ToLower(),新的字符串和你以前的字符串不会改变.


Jeb*_*Jeb 18

字符串是不可变的.您可以使用字符串生成器类来帮助!:

string str = "valta is the best place in the World";

StringBuilder strB = new StringBuilder(str);

strB[0] = 'M';
Run Code Online (Sandbox Code Playgroud)


Pau*_*nça 9

我做了一个方法来做到这一点

    string test = "Paul";
    test = ReplaceAtIndex(0, 'M', test);

    (...)

    static string ReplaceAtIndex(int i, char value, string word)
    {
        char[] letters = word.ToCharArray();
        letters[i] = value;
        return string.Join("", letters);
    }
Run Code Online (Sandbox Code Playgroud)

  • 你应该做一个扩展方法. (3认同)
  • 最佳解决方案,因为它可以用于第一个字符以外的情况。其他答案似乎有限。 (2认同)

bad*_*sel 7

虽然它没有准确地回答OP的问题,但取决于你正在做什么,它可能是一个很好的解决方案.以下是解决我的问题.

假设您必须对字符串中的各种字符进行大量单独操作.char[]在进行操作时,不是一直使用字符串而是使用数组.因为你可以这样做:

 char[] array = "valta is the best place in the World".ToCharArray();
Run Code Online (Sandbox Code Playgroud)

然后根据需要操纵你的心灵内容......

 array[0] = "M";
Run Code Online (Sandbox Code Playgroud)

然后在完成后将其转换为字符串,并且需要将其用作字符串:

string str = new string(array);
Run Code Online (Sandbox Code Playgroud)

  • 我的情况是固定长度的字符串。所以就我而言,我真的只想要最快的方法来替换角色。我没有敲其他方法。只是分享一个对我有用的有效方法。 (2认同)

nat*_*nho 6

使用扩展方法合并了Chuck Norris的答案/PauloMendonça:

/// <summary>
/// Replace a string char at index with another char
/// </summary>
/// <param name="text">string to be replaced</param>
/// <param name="index">position of the char to be replaced</param>
/// <param name="c">replacement char</param>
public static string ReplaceAtIndex(this string text, int index, char c)
{
    var stringBuilder = new StringBuilder(text);
    stringBuilder[index] = c;
    return stringBuilder.ToString();
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*nna 5

str = "M" + str.Substring(1);
Run Code Online (Sandbox Code Playgroud)

如果您要进行多项此类更改,请使用a StringBuilder或a char[].

(何时StringBuilder变得更快的阈值是在约5个连接或子串之后,但请注意,a + "b" + c + d + "e" + f在单个调用中完成的分组连接和编译类型的连接"a" + "b" + "c"完全不需要调用).

似乎必须这样做是非常低效的,但字符串不能更改的事实允许大量的效率增益和其他优点,如Why .NET String中提到的不可变?


Vas*_*sya 4

我在不安全的情况下找到了解决方案:

    string str = "gg"; char c = 'H'; int index = 1;
    fixed (char* arr = str) arr[index] = 'H';
    Console.WriteLine(str);
Run Code Online (Sandbox Code Playgroud)

就是这么简单。在安全的情况下:

    string str = "gg"; char c = 'H'; int index = 1;
    GCHandle handle = GCHandle.Alloc(str, GCHandleType.Pinned);
    IntPtr arrAddress = handle.AddrOfPinnedObject();
    Marshal.WriteInt16(arrAddress + index * sizeof(char), c);
    handle.Free();
    Console.WriteLine(str);
Run Code Online (Sandbox Code Playgroud)