2010-07-16 4 views
8

Voglio fare questo:C'è un modo semplice per cambiare un carattere in una stringa in C#?

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

e s diventerà "AXC". Tuttavia, sembra che la stringa [i] abbia solo un getter e non abbia setter. Il compilatore mi dà il seguente errore:

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

Credo di poter creare un ciclo e modificare il carattere desiderato. ma mi stavo chiedendo se c'è un modo semplice per farlo? E perché non c'è un setter per string [i]?

Grazie in anticipo.

+2

Le stringhe in C# sono immutabili, quindi non è possibile farlo. – ChrisF

risposta

18

stringhe sono immutabili, quindi bisogna fare una serie char[], modificarlo, quindi fare ritorno in una stringa:

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

grazie. la seconda riga dovrebbe essere char [] arr .... tho :) – StarCub

+0

L'ho visto e corretto. Grazie comunque :) –

1

Non credo che si può fare questo in C#, come la stringa non può essere alterato (appena distrutto e ricreato). Dai un'occhiata alla classe StringBuilder.

2

(Il vostro esempio è leggermente sbagliata:. S [2] = 'x' dovrebbe cambiare in "ABX")

No non è possibile, dal momento che le stringhe sono immutabili, è necessario creare una nuova stringa :

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

È necessario utilizzare un metodo che restituisca una nuova stringa con la modifica desiderata.

Spero che questo aiuti!

+0

ovviamente! Grazie per la segnalazione! lol – StarCub

13

stringhe sono immutabili che è il motivo per cui non c'è setter, è possibile comunque utilizzare un costruttore di stringa:

StringBuilder s = new StringBuilder("abc"); 

s[1] = 'x'; 
2

Ricordate, nel gestito e sicuro Net, le stringhe sono immutabili, quindi, anche se si potrebbe fare quanto sopra , potresti davvero creare una nuova copia della stringa con la sostituzione.

Se si sostituisce solo un carattere, un loop semplice è probabilmente la soluzione migliore.

Tuttavia, se avete intenzione di fare sostituzioni multiple, è consigliabile utilizzare un StringBuilder:

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

dovrebbe essere stringBuilder [1] = 'x' non stringBuilder [2]. Questo ritorna abx. – btlog

+0

@btlog - Corretto. Ta. –

0

Cosa c'è su questo?

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

Riguardo a string newString = originalString.Remove (index, 1) .Insert (index, charToReplace) – btlog

0

sì in C# stringa non può essere modificato.

ma possiamo provare questa risposta

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

sarà "AXC". in quanto sostituirà la vecchia stringa con una nuova stringa.

+0

Ma se la stringa contiene diversi "b" e si desidera solo sostituire il primo, ciò non funzionerà. – ChrisF

1

Perché non fare questo se si sta utilizzando un po 'di Linq

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

Questo dovrebbe permettere di sostituire qualsiasi carattere che vuoi con qualsiasi carattere che vuoi.