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:
cevap
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.
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.
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?
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';
@Bobbity Bob bunun neden yanlış olduğuna biraz daha özel olabilir misin? Bence tek şey ben o neyi kastettiğini bilmiyorum – Jeb
(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 ... –
@Bobbity Bob Hayır endişe - teşekkürler! – Jeb
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);
}
/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();
}
, 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);
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. –
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
Kulağa hoş geliyor. Şerefe! –
- 1. Haritaya <Eşleme <String, Dize>
- 2. Java, bitshifts kullanırken, neden 1 << 32! = 1 << 31 << 1?
- 3. um Vim <code>is</code> için <code>is</code> den Python'la
- 4. Git, <<<<<<< HEAD dosyasına
- 5. Linq'da SUM nasıl edinilir?</p> <pre><code>get the sum of the count for each id </code></pre> <p>ama olan öğeler olabilir:
- 6. <Func <T, string>>
- 7. İçindeki eleman sayısı <5 in <a1 <0</ a1><T>
- 8. <a href.. in PHP
- 9. ArrayList <HashMap <String, String >> String []
- 10. İçinde Gettext kullanarak PHP <<< EOF dizgisi
- 11. Bir Tuple <string, string, Func <bool>>
- 12. <: <İş nasıl?
- 13. Toplamda 1 <= i <j <k <= n'de GLPK
- 14. EJS: <% = versus <% -
- 15. GCC#pragma mesajı</p> <pre><code>#pragma message "hello world" </code></pre> <p>aracılığıyla,
- 16. Python'un profili modülü: <string>: 1
- 17. ICollection <string> string []
- 18. eslint: Hata Ayrıştırma hatası: Bu koddan</p> <blockquote> <p>error Parsing error: The keyword 'const' is reserved</p> </blockquote> <p>: Anahtar kelime 'const'
- 19. ArrayList <ArrayList <String>> öğesini nasıl sıralayabilirim?
- 20. Marshal a java.util.Map <String, Dize>
- 21. Neden füzyon günlüğü bağlama hataları yapmıyor? Bir ASP.NET web başlatırsanız</p> <ul> <li>EnableLog DWORD 1</li> <li>LogFailures DWORD 1</li> </ul> <p>:
- 22. List <String> ile <form:select> nasıl doldurulur?
- 23. LINQ - Sözlük içine Listesini <string> çevirmek <string, string>
- 24. Perl: bunun <code>$b</code> sonunda</p> <ul> <li><pre><code>{ 'b' => { 'c' => 1, 'd' => 1, 'e' => 1 } }; </code></pre></li> </ul> <p>: Bunun sonunda referansı
- 25. bitiştirmek karakter Java bir <code>String</code> oluşturmak üzere <code>char</code> bitiştirmek için bir yol var mı java
- 26. dönüştürme Liste <String>
- 27. Tasarım <a href>, <button>, <input> in JSP
- 28. Nedir? ve << demek?
- 29. strcpy'nin bir <code>char *</code><code>String</code> adı sahip yanlış formu
- 30. Dönüştürme <Object> Koleksiyon <String>
Hangi hatayla karşılaşıyorsunuz? – Oded
Aldığı hata ne olursa olsun, iyi bir tanesidir. Dizeler değişmez nesnelerdir, derleyicinin bu talimat hakkında şikayette bulunması normaldir ... –
@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. –