2012-01-24 11 views
31

Bu kodu vardır. Bunu denediğimde: Bir hata iletisi aldım. Bunu nasıl yapabilirim?Dize 1 karakter nasıl değiştirilir?</p> <pre><code>string str = "valta is the best place in the World"; </code></pre> <p>İlk sembolü değiştirmesi gerekir:

+3

Hangi hatayla karşılaşıyorsunuz? – Oded

+1

Aldığı hata ne olursa olsun, iyi bir tanesidir. Dizeler değişmez nesnelerdir, derleyicinin bu talimat hakkında şikayette bulunması normaldir ... –

+0

@Oded - bunun işe yaramamasının birkaç nedeni vardır. String, .NET'in, örneğin, bunun işe yaradığı Delphi'nin aksine değişmez. Dize karakterlerini bu şekilde dizine göre değiştiremezsiniz. C# ayrıca char dizeleri örtük dönüşüm vardır - 'M' {char c = 'M'} olarak bildirilmesi gerekir. –

cevap

37

Dizeler değişkendir, yani bir karakteri değiştiremezsiniz. Bunun yerine, yeni dizeler oluşturursunuz.

Ne soruyorsunuz birkaç yolla yapılabilir. En uygun çözüm, orijinal dizgeye yaptığınız değişikliklerin yapısına bağlı olarak değişecektir. Sadece bir karakteri mi değiştiriyorsun? Eklemek/silmek/eklemek ister misiniz?

İşte varolan dizesinden yeni dize oluşturmak için birkaç yolu vardır, ancak farklı bir ilk karakteri haiz:

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

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

Yukarıda, yeni dize orijinal değişken str atanır.

Ayrıca, StringBuilder gösteren diğer yanıtların da çok uygun olduğunu eklemek istiyorum. Bir karakteri değiştirmek için StringBuilder'u başlatılamıyordum, ancak çok sayıda değişikliğe ihtiyaç varsa, StringBuilder, süreçte geçici bir yeni dizi oluşturan örneklerimden daha iyi bir çözümdür. StringBuilder, birçok değişikliğe izin veren ve/veya işlem ekleyebilen değiştirilebilen bir nesne sağlar. Değişiklikleriniz bittiğinde, StringBuilder'dan .ToString() yöntemiyle bir değişmez dize oluşturulur. StringBuilder nesnesinde değişiklik yapmaya ve .ToString() kullanarak daha fazla yeni dizi oluşturmaya devam edebilirsiniz.

31

Bunun için StringBuilder sınıfını kullanmanızı ve gerekiyorsa dizeye ayrıştırmanızı öneririm. Sen çünkü C# dizesinde, bu şekilde dize ait karakterleri değiştiremezsiniz

System.Text.StringBuilder strBuilder = new System.Text.StringBuilder("valta is the best place in the World"); 
strBuilder[0] = 'M'; 
string str=strBuilder.ToString(); 

dinamik değildir ve değişmez olduğunu ve karakter salt okunur bu. İçinde dize yöntemlerini kullanmaya çalıştığınızdan emin olmak için, örneğin, str.ToLower() yaparsanız, yeni dize yapar ve önceki dizeniz değişmez.

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

Eğer yapacağız Eğer birkaç tür değişiklikler bir StringBuilder veya char[] kullanın.

(StringBuilder hızlı olduğunda eşiği a + "b" + c + d + "e" + f ait ardışımlanması tek bir çağrıda yapılır ve "a" + "b" + "c" ait derleme tipi concatenations bir çağrı hiç gerek yoktur gruplandırılmış yaklaşık 5 concatenations veya alt dizelerini ancak not sonradır).

Bunu yapmak zorunda korkunç verimsiz olduğunu görünebilir, ama dizeleri değişiklikler olamayacağı gerçeği Why .NET String is immutable?

13

Strings sözü iletmenin gibi verimlilik kazanımları sürü ve diğer avantajları sağlar. Dize oluşturucu sınıfını kullanabilirsiniz !:

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

StringBuilder strB = new StringBuilder(str); 

strB[0] = 'M'; 
+0

@Bobbity Bob bunun neden yanlış olduğuna biraz daha özel olabilir misin? Bence tek şey ben o neyi kastettiğini bilmiyorum – Jeb

+0

(kendi ToString yöntemini kullanarak) geri dize oluşturucu bir dizeye atanmamış olması. Kodu çalıştırdım ve işe yarıyor. eğer cevabınızı düzenlerseniz (bir yere bir boşluk eklerseniz) ben de çok özveriyorum .. şimdi iyi görünüyor ... –

+0

@Bobbity Bob Hayır endişe - teşekkürler! – Jeb

6

Bu

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

Bir uzantı yöntemi kullanmalısınız. – Otiel

+0

harika olurdu! –

+0

en iyi çözüm, ilk karakter dışındaki durumlarda kullanılabilir. Diğer cevaplar sınırlı görünüyor. – gunwin

5

/Paulo Mendonça en kullanarak uzantıları yöntemlerle w Chuck Norris'in cevabını Birleştirilmiş yapmak için bir Yöntem yaptı: o tam OP'ın soruya cevap etmese de

/// <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

, bağlı neyi Yapıyorsunuz iyi bir çözüm olabilir. Aşağıda benim sorunumu çözecek.

Dize içindeki çeşitli karakterlerin çok fazla bireysel olarak değiştirilmesi gerektiğini varsayalım. Eğer manipülasyon yaparken yerine bir dize kullanarak bütün zaman bir char[] dizi kullanın. Bunu Çünkü:

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

Sonra kadar istediğiniz kadar kalpleri içerik manipüle

...

array[0] = "M"; 

Sonra İşiniz bittiğinde bir dizeye dönüştürmek ve bunu kullanmak gerekir string olarak:

string str = new string(array); 
+0

Ama '[]' a Char daha iyi bir seçim StringBuilder' değil? Bir 'Char []' hemen hemen uzunluğu sabit kalan sararken 'StringBuilder', append, ekleme, kaldırma ve biçimi için yöntemleri vardır. Tek karakterli manipülasyonlarla sabit uzunlukta bir dizeyle uğraşırsam, char [] 'ı seçebilirim. –

+0

Benim durumum sabit uzunluklu bir dizeydi. Yani benim durumumda, bir karakteri değiştirmenin en hızlı yolunu gerçekten istiyorum. Diğer yöntemleri çalmadım. Sadece benim için çalışan geçerli bir yöntemi paylaşıyorum. – badweasel

+0

Kulağa hoş geliyor. Şerefe! –

İlgili konular