2012-01-24 53 views
31

我有这样的代码:如何更改字符串中的1个字符?

string str = "valta is the best place in the World"; 

我需要更换的第一个符号。当我尝试此操作时:

str[0] = 'M'; 

我收到一个错误消息。我怎样才能做到这一点?

+3

你会得到什么错误? – Oded

+1

无论他遇到什么错误,都是一件好事。字符串是不可变的对象,编译器会抱怨这条指令是正常的... –

+0

@Oded - 这有些原因不起作用。字符串在.NET中是不可变的,不像Delphi,在这里可以工作。你不能像这样通过索引来改变字符串。 C#也没有从字符串到char的隐式转换 - 'M'必须声明为{char c ='M'}。 –

回答

37

字符串是不可变的,这意味着您不能更改字符。相反,你创建新的字符串。

你在问什么可以做几种方法。最适合的解决方案将根据您对原始字符串所做更改的性质而有所不同。你只改变一个角色吗?你需要插入/删除/附加?

这里有几个方法可以创建从现有字符串的新字符串,但具有不同的第一个字符:

str = 'M' + str.Remove(0, 1); 

str = 'M' + str.Substring(1); 

以上,新的字符串被分配到原始变量,str

我想补充一点,其他人的答案证明StringBuilder也是非常合适的。我不会实例化一个StringBuilder来更改一个字符,但是如果需要很多更改StringBuilder是比我的示例更好的解决方案,它会在该过程中创建临时新字符串。 StringBuilder提供了一个可变对象,允许进行许多更改和/或追加操作。完成更改后,将使用.ToString()方法从StringBuilder创建一个不可变字符串。您可以继续对StringBuilder对象进行更改,并根据需要使用.ToString()创建更多新字符串。

31

我建议你使用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()它使新的字符串和您的以前的字符串不会改变。

5
str = "M" + str.Substring(1); 

如果你会做一些这样的变化使用StringBuilderchar[]

(当StringBuilder变得更快的阈值后约5级联或串,但是需要注意的是分组的a + "b" + c + d + "e" + f串连在一个单一的调用来完成和"a" + "b" + "c"编译型串联都不需要在所有的调用)。

这似乎是不得不这样做,这是可怕的效率不高,但事实上,弦不能改变可以容纳更多的提高效率等方面的优势,如在Why .NET String is immutable?

13

字符串提到的是不可变的。您可以使用字符串构建器类来帮助!:

string str = "valta is the best place in the World"; 

StringBuilder strB = new StringBuilder(str); 

strB[0] = 'M'; 
+0

@Bobbity鲍勃你可以更具体一些,为什么这是不正确的?我想所有我没有分配回字符串从字符串生成器(通过使用它的ToString方法) – Jeb

+0

我不知道我的意思是什么。我只是运行代码,它的工作原理。如果你编辑你的答案(如插入一个空间的地方),我也会upvote它..现在似乎很好... –

+0

@鲍勃鲍勃不用担心 - 谢谢! – Jeb

6

我做了一个方法来做到这一点

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); 
    } 
+3

你应该做一个扩展方法。 – Otiel

+0

会很棒! –

+0

最好的解决方案,因为它可以在第一个字符以外的情况下使用。其他答案似乎有限。 – gunwin

5

合并查克·诺里斯的回答瓦特/保罗·门多卡的使用扩展方法:

/// <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(); 
} 
6

虽然它不回答OP的问题正是,取决于什么你这样做可能是一个很好的解决方案。下面是要解决我的问题。

假设您必须对字符串中的各种字符进行大量的单独操作。在进行操作时,不要使用字符串,而应使用char[]阵列。因为你可以这样做:

char[] array = "valta is the best place in the World".ToCharArray(); 

然后操纵你的心内容尽可能多,因为你需要...

array[0] = "M"; 

然后将其转换为字符串一旦你完成,并需要使用它作为字符串:

string str = new string(array); 
+0

但是'StringBuilder'不是'char []'的更好选择吗? 'StringBuilder'具有追加,插入,删除和格式的方法,而'char []'几乎保持固定长度。我想如果我正在处理一个固定长度的字符串只有单个字符操作,我可能会选择'char []'。 –

+0

我的情况是一个固定长度的字符串。所以在我的情况下,我真的只想要最快的方式来替换一个字符。我没有敲别的方法。只是分享一个适合我的有效方法。 – badweasel

+0

听起来不错。干杯! –