在C#字符串中更改某个索引处的字符的默认方法是什么?

时间:2014-03-23 13:47:04

标签: c# string

我有一个字符串:

string s = "abc";

我想将第二个字符更改为'd',因此它将是“adc” 我认为这样可行:

s[1] = 'd';

但是我收到错误:

Property or indexer 'string.this[int] 'cannot be assigned to -- it is read only

如何完成这项简单的任务(不使用相当复杂的子串方法?

5 个答案:

答案 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.RemoveString.Insert方法。这是LINQPad;

的示例
string s = "abc";
s = s.Remove(1, 1).Insert(1, "d");
s.Dump(); //adc

请注意,stringimmutable 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