82

I have this code:

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

I need to replace the first symbol. When I try this:

str[0] = 'M';

I received an error. How can I do this?

4
  • 1
    Whatever error he is getting is a good one. Strings are immutable objects, it's normal for the compiler to complain about that instruction... Commented Jan 24, 2012 at 13:00
  • @Oded - there are a number of reasons why this won't work. String is immutable in .NET, unlike, for example, Delphi, where this would work. You can't change string characters by index like this. C# also has no implicit conversions from strings to char - 'M' would have to be declared as {char c = 'M'}. Commented Jan 24, 2012 at 13:02
  • 2
    @J... - True enough. My comment was more on the "how to ask a question" side of things. Commented Jan 24, 2012 at 13:10
  • Possible duplicate of Replacing a char at a given index in string? Commented Feb 17, 2016 at 17:15

12 Answers 12

74

Strings are immutable, meaning you can't change a character. Instead, you create new strings.

What you are asking can be done several ways. The most appropriate solution will vary depending on the nature of the changes you are making to the original string. Are you changing only one character? Do you need to insert/delete/append?

Here are a couple ways to create a new string from an existing string, but having a different first character:

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

str = 'M' + str.Substring(1);

Above, the new string is assigned to the original variable, str.

I'd like to add that the answers from others demonstrating StringBuilder are also very appropriate. I wouldn't instantiate a StringBuilder to change one character, but if many changes are needed StringBuilder is a better solution than my examples which create a temporary new string in the process. StringBuilder provides a mutable object that allows many changes and/or append operations. Once you are done making changes, an immutable string is created from the StringBuilder with the .ToString() method. You can continue to make changes on the StringBuilder object and create more new strings, as needed, using .ToString().

Sign up to request clarification or add additional context in comments.

2 Comments

Make sure to prevent null exceptions by adding this line if (!string.IsNullOrEmpty(str)) right before your preferred method.
Alternatively. You can do str[1..] (Range from index 1 to Length of str) to skip the 1st character in str. I personally find ranges cleaner to read.
55

I suggest you to use StringBuilder class for it and than parse it to string if you need.

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

You can't change string's characters in this way, because in C# string isn't dynamic and is immutable and it's chars are readonly. For make sure in it try to use methods of string, for example, if you do str.ToLower() it makes new string and your previous string doesn't change.

Comments

32

Strings are immutable. You can use the string builder class to help!:

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

StringBuilder strB = new StringBuilder(str);

strB[0] = 'M';

2 Comments

@Bobbity Bob can you be a little more specific why this is incorrect? All I think is that I haven't assigned back to a string from the string builder (by using its ToString method)
I have no idea what I meant by that. i just ran the code and it works. if you edit your answer (like insert a space somewhere) I will upvote it too.. seems fine now...
22

While it does not answer the OP's question precisely, depending on what you're doing it might be a good solution. Below is going to solve my problem.

Let's say that you have to do a lot of individual manipulation of various characters in a string. Instead of using a string the whole time use a char[] array while you're doing the manipulation. Because you can do this:

 char[] array = "valta is the best place in the World".ToCharArray();

Then manipulate to your hearts content as much as you need...

 array[0] = "M";

Then convert it to a string once you're done and need to use it as a string:

string str = new string(array);

4 Comments

But isn't StringBuilder a better choice than a char[]? StringBuilder has methods for append, insert, remove, and format, while a char[] is going to pretty much stay fixed length. I suppose if I were dealing with a fixed length string with only single character manipulations I might choose char[].
My case was for a fixed length string. So in my case I really just want the fastest way to replace a character. I wasn't knocking other methods. Just sharing a valid method that worked for me.
Exactly what I needed just now, so thanks for sharing anyway.
Good point, char[] is much simpler and more intuitive than StringBuilder for the task in question.
11

Merged Chuck Norris's answer w/ Paulo Mendonça's using extensions methods:

/// <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();
}

Comments

10

I made a Method to do this

    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);
    }

3 Comments

You should do an extension method.
best solution as it can be used in cases other than the first character. Other answers seem limited.
or use return string.Concat(letters);
6
str = "M" + str.Substring(1);

If you'll do several such changes use a StringBuilder or a char[].

(The threshold of when StringBuilder becomes quicker is after about 5 concatenations or substrings, but note that grouped concatenations of a + "b" + c + d + "e" + f are done in a single call and compile-type concatenations of "a" + "b" + "c" don't require a call at all).

It may seem that having to do this is horribly inefficient, but the fact that strings can't be changes allows for lots of efficiency gains and other advantages such as mentioned at Why .NET String is immutable?

Comments

5

I found a solution in unsafe context:

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

It's so simple. And in safe context:

    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);

1 Comment

It's quite weird to broke the fundamental string immutable functionality, as a default C# dev won't expect such a turnaround. But TBH I came here for this kind of answer (still not gonna use it in prod)
4

Can also be done using C# 8 ranges:

str = "M" + str[1..];

or + string interpolation:

str = $"M{str[1..]}";

1 Comment

This is an awesome answer - nice and fast too with the final IL.
3

If speed is important, then you can do this:

String strValue = "$Some String Here!";
strValue = strValue.Remove(0, 1).Insert(0, "*");

This way, you don't really reconstruct the string, you keep the original object and just removing the first character and inserting a new one.

1 Comment

Actually this creates 3 strings, because each Remove() and Insert() create a new string (see MS documentation). With safe code an update in the same string object is impossible. I guess fastest is str = "M" + str[1..];
0

I usually approach it like this:

   char[] c = text.ToCharArray();
   for (i=0; i<c.Length; i++)
   {
    if (c[i]>'9' || c[i]<'0') // use any rules of your choice
    {
     c[i]=' '; // put in any character you like
    }
   }
   // the new string can have the same name, or a new variable       
   String text=new string(c); 

Comments

0

Whilst probably not the best use of LINQ, here's a solution using LINQ:

string str = "valta is the best place in the world";
int index = 0;
char ch = 'M';
str = string.Join("", str.Select((c, i) => i == index ? ch : c));

If there are subsequent LINQ operations you could chain them together:

string str = "valta is the best place in the world";
str = string.Join("", str.Select((c, i) => i == 0 ? 'P' : c)
                         .Select((c, i) => i == 1 ? 'a' : c)
                         .Select((c, i) => i == 2 ? 'r' : c)
                         .Select((c, i) => i == 3 ? 'i' : c)
                         .Select((c, i) => i == 4 ? 's' : c));

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.