someString[someRandomIdx] = 'g';
will give me an error.
How do I achieve the above?
someString[someRandomIdx] = 'g';
will give me an error.
How do I achieve the above?
If it is of type string
then you can't do that because strings are immutable - they cannot be changed once they are set.
To achieve what you desire, you can use a StringBuilder
StringBuilder someString = new StringBuilder("someString");
someString[4] = 'g';
Update
Why use a string
, instead of a StringBuilder
? For lots of reasons. Here are some I can think of:
C# strings are immutable. You should create a new string with the modified contents.
char[] charArr = someString.ToCharArray();
charArr[someRandomIdx] = 'g'; // freely modify the array
someString = new string(charArr); // create a new string with array contents.
Since no one mentioned a one-liner solution:
someString = someString.Remove(index, 1).Insert(index, "g");
If you absolutely must change the existing instance of a string, there is a way with unsafe code:
public static unsafe void ChangeCharInString(ref string str, char c, int index)
{
GCHandle handle;
try
{
handle = GCHandle.Alloc(str, GCHandleType.Pinned);
char* ptr = (char*)handle.AddrOfPinnedObject();
ptr[index] = c;
}
finally
{
try
{
handle.Free();
}
catch(InvalidOperationException)
{
}
}
}
Check out this article on how to modify string contents in C#. Strings are immutable so they must be converted into intermediate objects before they can be modified.
If you're willing to introduce Also(...)
:
public static class Ext
{
public static T Also<T>(this T arg, Action<T> act)
{
act(arg); return arg;
}
public static string ReplaceCharAt(this string str, int index, char replacement) =>
new string(str.ToCharArray().Also(arr => arr[index] = replacement));
}
Which can be used as:
void Main()
{
string str = "This is string";
Console.WriteLine(str);
var str2 = str.ReplaceCharAt(0,'L').ReplaceCharAt(1,'i').ReplaceCharAt(2,'l').ReplaceCharAt(3,'y');
Console.WriteLine(str2);
}
To get the following output: