Saya punya string ini: ABCDEFGHIJ
Saya perlu mengganti dari posisi 4 ke posisi 5 dengan string ZX
Ini akan terlihat seperti ini: ABCZXFGHIJ
Tetapi tidak untuk digunakan dengan string.replace("DE","ZX")
- Saya perlu menggunakan dengan posisi
Bagaimana saya bisa melakukannya?
Jawaban:
Cara termudah untuk menambah dan menghapus rentang dalam string adalah dengan menggunakan
StringBuilder
.Alternatifnya adalah menggunakan
String.Substring
, tetapi saya pikirStringBuilder
kodenya menjadi lebih mudah dibaca.sumber
sumber
ReplaceAt (indeks int, panjang int, ganti string)
Berikut adalah metode ekstensi yang tidak menggunakan StringBuilder atau Substring. Metode ini juga memungkinkan string pengganti untuk memperpanjang melewati panjang string sumber.
Saat menggunakan fungsi ini, jika Anda ingin seluruh string pengganti mengganti karakter sebanyak mungkin, kemudian atur panjang ke panjang string pengganti:
Jika tidak, Anda dapat menentukan jumlah karakter yang akan dihapus:
Jika Anda menentukan panjangnya menjadi 0, maka fungsi ini bertindak seperti fungsi sisipan:
Saya kira ini lebih efisien karena kelas StringBuilder tidak perlu diinisialisasi dan karena menggunakan operasi yang lebih mendasar. Tolong koreksi saya jika saya salah. :)
sumber
Gunakan
String.Substring()
(perincian di sini ) untuk memotong bagian kiri, lalu pengganti Anda, lalu bagian kanan. Mainkan dengan indeks sampai Anda melakukannya dengan benar :)Sesuatu seperti:
sumber
Sebagai metode ekstensi.
sumber
sumber
t
kembali lagi.Jika Anda peduli dengan kinerja, maka hal yang ingin Anda hindari di sini adalah alokasi. Dan jika Anda berada di Net Inti 2.1 + (atau, belum belum pernah dirilis, Net Standard 2.1), maka Anda bisa, dengan menggunakan satu
string.Create
metode :Pendekatan ini lebih sulit dipahami daripada alternatifnya, tetapi hanya itu yang akan mengalokasikan hanya satu objek per panggilan: string yang baru dibuat.
sumber
Anda dapat mencoba sesuatu yang menghubungkan ini:
sumber
Seperti yang lain telah disebutkan
Substring()
fungsi ada karena suatu alasan:Saya juga menghitung waktu ini terhadap
StringBuilder
solusi dan mendapatkan 900 tics vs 875. Jadi sedikit lebih lambat.sumber
"ABCDEFGHIJ"
dan"ZX"
panjangnya berbeda.Dan lagi
sumber
Dengan bantuan posting ini, saya membuat fungsi berikut dengan pemeriksaan panjang tambahan
sumber
Semua jawaban lain tidak berfungsi jika string berisi karakter Unicode char (seperti Emoji) karena karakter Unicode char lebih banyak byte daripada char.
Dengan topik ini , saya memperpanjang kelas StringInfo untuk Ganti dengan posisi menjaga algoritma Nick Miller untuk menghindari itu:
sumber
Saya mencari solusi dengan persyaratan sebagai berikut:
Solusi 1
Solusi yang paling cocok untuk saya adalah ini:
Ini menggunakan
StringBuilder.Replace(oldChar, newChar, position, count)
Solusi 2
Solusi lain yang memenuhi persyaratan saya adalah digunakan
Substring
dengan penggabungan:Ini juga OK. saya kira itu tidak seefisien kinerja pertama yang bijaksana (karena penggabungan string yang tidak perlu). Tetapi optimasi prematur adalah akar dari semua kejahatan .
Jadi pilih salah satu yang paling Anda sukai :)
sumber
Lebih baik menggunakan
String.substr()
.Seperti ini:
sumber
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 stringConcat()
atau stringRemove()
danInsert()
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 dekat
string
danStringBuilder
, keduanya secara internal memperlakukan string yang diberikan sebagai array karakter. Jika kita melihat implementasiStringBuilder
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 iniSolusi 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
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 menggunakanStringBuilder
untuk mengubah array karakter.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.
sumber
sumber
Berikut ini adalah metode ekstensi sederhana:
Gunakan seperti ini:
sumber
Saya percaya cara paling sederhana adalah: (tanpa stringbuilder)
Ini berfungsi karena variabel tipe string dapat diperlakukan sebagai array variabel char. Misalnya, Anda dapat merujuk ke karakter kedua dari variabel string dengan nama "myString" sebagai myString [1]
sumber
string
karakter yang akan diganti masing-masing hanya terjadi satu kali. Jika Anda menjalankan ini melawan, katakanlah,"DBCDEFGHIE"
maka Anda dapatkan"ZBCZXFGHIX"
, yang bukan hasil yang diinginkan. Juga, saya tidak akan setuju bahwa ini lebih sederhana daripada non-StringBuilder
solusi lain yang diposting dua setengah tahun yang lalu.