我有这段代码:
string str = "valta is the best place in the World";
我需要替换第一个符号。当我尝试这个时:
str[0] = 'M';
我收到了一个错误。我怎么能这样做?
答案 0 :(得分:43)
字符串是不可变的,这意味着您无法更改字符。而是创建新的字符串。
您所要求的可以通过多种方式完成。最合适的解决方案将根据您对原始字符串所做更改的性质而有所不同。你只改变一个角色吗?你需要插入/删除/附加吗?
以下是从现有字符串创建新字符串的几种方法,但具有不同的第一个字符:
str = 'M' + str.Remove(0, 1);
str = 'M' + str.Substring(1);
在上面,新字符串被分配给原始变量str
。
我想补充一点,展示StringBuilder
的其他人的答案也非常合适。我不会实例化StringBuilder
来更改一个字符,但如果需要进行许多更改StringBuilder
是比我在流程中创建临时新字符串的示例更好的解决方案。 StringBuilder
提供了一个允许许多更改和/或追加操作的可变对象。完成更改后,将使用StringBuilder
方法从.ToString()
创建不可变字符串。您可以继续对StringBuilder
对象进行更改,并根据需要使用.ToString()
创建更多新字符串。
答案 1 :(得分:34)
我建议您使用StringBuilder
类,然后根据需要将其解析为字符串。
System.Text.StringBuilder strBuilder = new System.Text.StringBuilder("valta is the best place in the World");
strBuilder[0] = 'M';
string str=strBuilder.ToString();
你不能以这种方式改变字符串的字符,因为在C#中,字符串不是动态的并且是不可变的,它的字符是只读的。为了确保在其中尝试使用字符串的方法,例如,如果你执行str.ToLower()
它会生成新的字符串,而你之前的字符串不会改变。
答案 2 :(得分:18)
字符串是不可变的。您可以使用字符串构建器类来帮助!:
string str = "valta is the best place in the World";
StringBuilder strB = new StringBuilder(str);
strB[0] = 'M';
答案 3 :(得分:8)
我做了一个方法来做到这一点
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);
}
答案 4 :(得分:7)
虽然它没有准确地回答OP的问题,但根据你所做的事情,它可能是一个很好的解决方案。以下是解决我的问题。
让我们说你必须对字符串中的各种字符进行大量的单独操作。在您进行操作时,不是使用字符串,而是使用char[]
数组。因为你可以这样做:
char[] array = "valta is the best place in the World".ToCharArray();
然后尽可能多地操纵你的内心......
array[0] = "M";
然后在完成后将其转换为字符串,并将其用作字符串:
string str = new string(array);
答案 5 :(得分:5)
str = "M" + str.Substring(1);
如果您要进行多项此类更改,请使用StringBuilder
或char[]
。
(StringBuilder
变得更快的阈值是在约5个连接或子串之后,但请注意a + "b" + c + d + "e" + f
的分组连接是在单个调用和{{1}的编译类型连接中完成的。根本不需要打电话。
似乎必须这样做是非常低效的,但字符串无法改变的事实可以带来很多效率提升和其他优势,例如Why .NET String is immutable?
中提到的答案 6 :(得分:5)
合并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();
}
答案 7 :(得分:1)
我在不安全的上下文中找到了解决方案:
string str = "gg"; char c = 'H'; int index = 1;
fixed (char* arr = str) arr[index] = 'H';
Console.WriteLine(str);
就是这么简单。 在安全的情况下:
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);
答案 8 :(得分:0)
我通常是这样处理的:
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);