2010-07-16 9 views
8

Я хочу, чтобы это сделать:Есть ли простой способ изменить символ в строке на C#?

string s = "abc"; 
s[1] = 'x'; 

и s станет "AXC". Однако, кажется, что строка [i] имеет только геттер и не имеет сеттера. Компилятор дает мне следующую ошибку:

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

Я думаю, я мог бы создать цикл и изменить char, который я хочу. но мне просто интересно, есть ли простой способ сделать это? И почему нет сеттера для строки [i]?

Заранее спасибо.

+2

Строки в C# неизменяемы, поэтому вы не можете этого сделать. – ChrisF

ответ

18

Строки неизменны, так что вы должны сделать char[] массив, изменить его, а затем сделать его обратно в строку:

string s = "foo"; 
char[] arr = s.ToCharArray(); 
arr[1] = 'x'; 
s = new string(arr); 
+0

спасибо. вторая строка должна быть char [] arr .... tho :) – StarCub

+0

Я видел ее и исправил ее. Спасибо в любом случае :) –

1

Я не думаю, что вы можете сделать это в C#, как строка не могут быть изменены (просто уничтожены и воссозданы). Посмотрите на класс StringBuilder. не

2

(Ваш пример немного не так:. s [2] = «х» следует изменить его на «ABX»)

Нет, вы не можете, поскольку строки являются неизменными, вы должны создать новую строку :

http://en.wikipedia.org/wiki/Immutable_object

Вы должны использовать метод, который возвращает новую строку с требуемой модификацией.

Надеюсь, что это поможет!

+0

конечно! Спасибо что подметил это! lol – StarCub

13

Строк неизменны поэтому нет сеттера, вы можете однако использовать строковый построитель:

StringBuilder s = new StringBuilder("abc"); 

s[1] = 'x'; 
2

Помните, что в управляемом и безопасном .Net, строки являются неизменными, так что даже если вы могли бы сделать выше , вы действительно создадите новую копию строки с заменой.

Если вы заменяете только один символ, простой цикл, вероятно, лучший выбор.

Однако, если вы собираетесь сделать несколько замен, рассмотрим с помощью StringBuilder:

string s = "abc"; 
    var stringBuilder = new StringBuilder(s); 
    stringBuilder[1] = 'x'; 
    s = stringBuilder.ToString(); 
+0

должен быть stringBuilder [1] = 'x' not stringBuilder [2]. Это возвращает abx. – btlog

+0

@btlog - Исправлено. Ta. –

0

Что об этом?

string originalString = "abc"; 

     var index = 1; 
     char charToReplace = 'x'; 

     var newString = string.Format("{0}{1}{2}", originalString.Substring(0, index), charToReplace, originalString.Substring(index + 1)); 
+2

Как насчет строки newString = originalString.Remove (index, 1) .Insert (index, charToReplace) – btlog

0

да в C# строка не может быть изменен.

но мы можем попробовать это

string s = "abc"; 
s = s.Replace('b', 'x'); 
Console.WriteLine(s); 

ответ будет "AXC". , поскольку это заменит старую строку новой строкой.

+0

Но если строка содержит несколько «b» и вы хотите заменить первую, это не сработает. – ChrisF

1

Почему бы не сделать это, если вы используете какое-то Linq

private string ConvertStr(string inStr , int inIndex , char inChar) 
{ 
char[] tmp = inStr.ToCharArray(); 
tmp.SetValue(inChar , inIndex); 
return new string(tmp); 
} 

Это должно позволить вам заменить любой символ вы хотите с любым символом вы хотите.

Смежные вопросы