我有一个字符串:
string s = "abc";
我想将第二个字符更改为'd',因此它将是“adc” 我认为这样可行:
s[1] = 'd';
但是我收到错误:
Property or indexer 'string.this[int] 'cannot be assigned to -- it is read only
如何完成这项简单的任务(不使用相当复杂的子串方法?
答案 0 :(得分:13)
String
是不可变的。您可以使用StringBuilder
来改变字符串:
var s = "abc";
var sb = new StringBuilder(s);
sb[1] = 'd';
s = sb.ToString();
答案 1 :(得分:2)
错误消息已清除,String.Chars
property是只读的。你不能帮助它。
这是如何定义的;
public char this[
int index
] { get; }
如您所见,没有set
访问者。
您可以使用String.Remove
和String.Insert
方法。这是LINQPad;
string s = "abc";
s = s.Remove(1, 1).Insert(1, "d");
s.Dump(); //adc
请注意,string
是immutable type。你无法改变它们。创建后无法修改。即使你认为你改变它们,你实际上也会创建新的字符串对象。
作为替代方案,您可以使用代表可变字符串的StringBuilder
类,因为StringBuilder.Chars
property已获取并设置了访问者。
var sb = new StringBuilder("abc");
sb[1] = 'd';
sb.Dump(); // adc
答案 2 :(得分:2)
不推荐,但您可以使用unsafe
上下文执行此操作:
fixed (char* pfixed = s)
pfixed[1] = 'd';
答案 3 :(得分:1)
字符串是不可变的。您无法更改字符串,只能创建新字符串。要修改类似的字符串,您应该使用StringBuilder
。
答案 4 :(得分:1)
您可以使用Enumerable.Select
:
string s = "abc";
string n = new string(s.Select((c, index) =>
{
if (index == 1)
return 'd';
else
return c;
}).ToArray());
Console.WriteLine(n); // adc