2010-07-16 13 views
8

ben bunu yapmak istiyorum:C# içindeki bir dizgede char'i değiştirmenin kolay bir yolu var mı?

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

ve s "AXC" haline gelecektir. Ancak, [i] dizgisinin sadece bir alıcıya sahip olduğu ve ayarlayıcı olmadığı görülmektedir. Derleyici bana aşağıdaki hatayı verir:

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

Sanırım bir döngü yapabilir ve istediğim karakteri değiştirebilirim. ama sadece bunu yapmanın kolay bir yolu olup olmadığını merak ediyordum? Ve neden string [i] için bir dizgi yok?

Şimdiden teşekkürler.

+2

C# içindeki dizgeler değişmezdir, dolayısıyla bunu yapamazsınız. – ChrisF

cevap

18

Karakter dizileri değişmez, bu nedenle daha sonra bunu değiştirmek, bir char[] dizi yapmak bir dizeye geri yapmak zorunda: dize olarak

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

teşekkürler. ikinci satır char [] arr .... tho olmalı :) – StarCub

+0

gördüm ve düzeltildi. Yine de teşekkürler :) –

1

Sana C# bunu yapabilirsiniz sanmıyorum değiştirilemez (sadece imha ve yeniden yaratılmış). StringBuilder sınıfına bir göz atın.

2

(Kişisel örneği biraz yanlış. S [2] = 'x' için "abx" değiştirmek gerekir)

Hayır dizeleri değişmez olduğundan, yeni bir dize oluşturmak zorunda yapamam, :

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

İstenen değişiklikle yeni bir dize döndüren bir yöntem kullanmalısınız.

Bu yardımcı olur umarım!

+0

elbette! Bunu işaret ettiğin için teşekkürler! – StarCub

13

Strings hiçbir ayarlayıcı var, neden ancak bir dize oluşturucu kullanabilirsiniz hangi iletmenin: yönetilen ve güvenli .NET,

StringBuilder s = new StringBuilder("abc"); 

s[1] = 'x'; 
2

hatırla Yukarıda yapabileceğini böylece bile dizeleri, değişken değildir; Gerçekten, dizgenin yerine yeni bir kopyasını oluşturuyordunuz.

Sadece bir karakteri değiştiriyorsanız, basit bir döngü muhtemelen en iyi bahistir. Birden değiştirmeler yapacağız eğer

Ancak, kullanmayı düşünün bir StringBuilder:

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

lol stringBuilder [1] = 'x' stringBuilder [2] olmalıdır. Bu, abx değerini döndürür. – btlog

+0

@btlog - Düzeltildi. Ta. –

0

bu konuda ne? C# dizesinde

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

Dize hakkında newString = originalString.Remove (dizin, 1) .Insert (index, charToReplace) – btlog

0

evet değiştirilemez.

ama biz bu

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

cevabı "AXC" olacaktır deneyebilirsiniz. , eski dizeyi yeni dizeyle değiştirir. Eğer istediğin her karakter ile istediğiniz her türlü karakter yerine izin gereken bazı Linq

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

kullanıyorsanız bunu neden

+0

Dize birkaç "b" harfi içeriyorsa ve yalnızca birincisini değiştirmek istiyorsanız, bu işe yaramaz. – ChrisF

1

.

İlgili konular