someString[someRandomIdx] = 'g';
会给我一个错误。
如何实现上述要求?
someString[someRandomIdx] = 'g';
会给我一个错误。
如何实现上述要求?
如果它的类型是string
,那么你不能这样做,因为字符串是不可变的——一旦设置就不能更改。
要实现你想要的效果,可以使用StringBuilder
。
StringBuilder someString = new StringBuilder("someString");
someString[4] = 'g';
更新
为什么要使用 string
而不是 StringBuilder
?有许多原因。以下是我想到的一些原因:
C# 字符串是不可变的。您应该创建一个具有修改内容的新字符串。
char[] charArr = someString.ToCharArray();
charArr[someRandomIdx] = 'g'; // freely modify the array
someString = new string(charArr); // create a new string with array contents.
既然没有人提到一行解决方案:
someString = someString.Remove(index, 1).Insert(index, "g");
ToCharArray()
比 StringBuilder
更快。其他人——你所关心的人也不应该使用 Matt Ellen 的答案,因为 Mehrdad Afshari 提出的那个更有效率。请参见此评论。 - polfosol ఠ_ఠ如果你一定要更改一个字符串的现有实例,可以使用不安全代码的方法:
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)
{
}
}
}
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));
}
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);
}
要获得以下输出:
你也可以使用Insert()
方法,例如:somestring.Insert(index,data)