如何在c#中的字符串中的索引处设置字符?

时间:2010-07-22 07:15:19

标签: c#

someString[someRandomIdx] = 'g';

会给我一个错误,

我如何实现上述目标?

修改

是的,它的类型是'string'

7 个答案:

答案 0 :(得分:37)

如果它是string类型,那么你就不能这样做,因为字符串是不可变的 - 一旦设置它们就无法更改。

要实现您的目标,您可以使用StringBuilder

StringBuilder someString = new StringBuilder("someString");

someString[4] = 'g';

<强>更新

为什么要使用string而不是StringBuilder?原因很多。以下是我能想到的一些内容:

  • 访问字符串的值更快。
  • 字符串可以被实现(这并不总是发生),因此如果您创建一个具有相同值的字符串,则不会使用额外的内存。
  • 字符串是不可变的,因此它们在基于散列的集合中工作得更好,并且它们本质上是线程安全的。

答案 1 :(得分:29)

C#字符串是不可变的。您应该使用修改后的内容创建一个新字符串。

 char[] charArr = someString.ToCharArray();
 charArr[someRandomIdx] = 'g'; // freely modify the array
 someString = new string(charArr); // create a new string with array contents.

答案 2 :(得分:4)

由于没有人提到一线解决方案:

someString = someString.Remove(index, 1).Insert(index, "g");

答案 3 :(得分:3)

如果您绝对必须更改字符串的现有实例,则可以使用不安全代码:

        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)
                {
                }
            }
        }

答案 4 :(得分:1)

查看this article如何修改C#中的字符串内容。 字符串是不可变的,因此必须先将它们转换为中间对象才能进行修改。

答案 5 :(得分:0)

如果您愿意介绍this.moveUp = function(){ if(this.y > gameCanvas.height / 8){ this.y -= 7; } }; this.moveDown = function(){ if(this.y < gameCanvas.height - map.tSizeY * 1.5){ this.y += 7; } }; this.moveLeft = function(){ if(this.x > gameCanvas.width / 8){ this.x -= 7; } }; this.moveRight = function(){ if(this.x < gameCanvas.width - map.tSizeX * 1.25){ this.x += 7; } }

Also(...)

答案 6 :(得分:-1)

您也可以使用Insert()方法,例如somestring.Insert(index,data)