string myString = "ABCDEFGHIJ";
string modifiedString = new StringBuilder(myString){[3]='Z', [4]='X'}.ToString();
Biarkan saya menjelaskan solusi saya.
Diberikan pernyataan masalah mengubah string dalam dua posisi spesifiknya ("posisi 4 ke posisi 5") dengan dua karakter 'Z' dan 'X' dan yang diminta adalah menggunakan indeks posisi untuk mengubah string dan bukan string. Ganti ( ) metode (mungkin karena kemungkinan pengulangan beberapa karakter dalam string aktual), saya lebih suka menggunakan pendekatan minimalis untuk mencapai tujuan menggunakan Substring()
dan string Concat()
atau string Remove()
dan Insert()
pendekatan. Meskipun semua solusi itu akan melayani tujuan dalam mencapai tujuan yang sama, tetapi itu hanya tergantung pada pilihan pribadi dan filosofi penyelesaian dengan pendekatan minimalis.
Kembali ke solusi saya sebutkan di atas, jika kita melihat lebih dekatstring
danStringBuilder
, keduanya secara internal memperlakukan string yang diberikan sebagai array karakter. Jika kita melihat implementasi StringBuilder
itu mempertahankan sesuatu variabel internal seperti " internal char[] m_ChunkChars;
" untuk menangkap string yang diberikan. Sekarang karena ini adalah variabel internal, kami tidak dapat langsung mengaksesnya. Untuk dunia eksternal, untuk dapat mengakses dan mengubah array karakter itu, StringBuilder
mengekspos mereka melalui properti pengindeks yang terlihat seperti di bawah ini
[IndexerName("Chars")]
public char this[int index]
{
get
{
StringBuilder stringBuilder = this;
do
{
// … some code
return stringBuilder.m_ChunkChars[index1];
// … some more code
}
}
set
{
StringBuilder stringBuilder = this;
do
{
//… some code
stringBuilder.m_ChunkChars[index1] = value;
return;
// …. Some more code
}
}
}
Solusi saya yang disebutkan di atas memanfaatkan kemampuan pengindeksan ini untuk secara langsung mengubah susunan karakter yang dipertahankan secara internal yang IMO efisien dan minimalis.
BTW; kita dapat menulis ulang solusi di atas dengan lebih rumit seperti di bawah ini
string myString = "ABCDEFGHIJ";
StringBuilder tempString = new StringBuilder(myString);
tempString[3] = 'Z';
tempString[4] = 'X';
string modifiedString = tempString.ToString();
Dalam konteks ini juga ingin menyebutkan bahwa dalam kasus string
itu juga memiliki properti pengindeks sebagai sarana untuk mengekspos array karakter internal, tetapi dalam kasus ini hanya memiliki properti Getter (dan tidak ada Setter) karena string tidak dapat diubah pada dasarnya. Dan itu sebabnya kita perlu menggunakan StringBuilder
untuk mengubah array karakter.
[IndexerName("Chars")]
public extern char this[int index] { [SecuritySafeCritical, __DynamicallyInvokable, MethodImpl(MethodImplOptions.InternalCall)] get; }
Dan yang terakhir, namun tidak sedikit, solusi ini hanya paling cocok untuk masalah khusus ini di mana permintaannya adalah mengganti hanya beberapa karakter dengan indeks posisi yang dikenal di muka. Ini mungkin bukan yang paling cocok ketika persyaratannya adalah untuk mengubah string yang cukup panjang yaitu jumlah karakter yang harus diubah jumlahnya besar.