Saya ingin memotong string sehingga panjangnya tidak lebih dari nilai yang diberikan. Saya menulis ke tabel database dan ingin memastikan bahwa nilai yang saya tulis memenuhi batasan tipe data kolom.
Sebagai contoh, alangkah baiknya jika saya dapat menulis yang berikut ini:
string NormalizeLength(string value, int maxLength)
{
return value.Substring(0, maxLength);
}
Sayangnya, ini menimbulkan pengecualian karena maxLength
umumnya melebihi batas string value
. Tentu saja, saya bisa menulis fungsi seperti berikut ini, tetapi saya berharap sesuatu seperti ini sudah ada.
string NormalizeLength(string value, int maxLength)
{
return value.Length <= maxLength ? value : value.Substring(0, maxLength);
}
Di mana API yang sulit dipahami yang melakukan tugas ini? Apakah ada satu?
StringBuilder
memungkinkan Anda memotong dengan memendekkan panjang, tetapi Anda masih perlu melakukan pemeriksaan panjang untuk menghindari pelebaran string..Trim()
dengan cara yang membuatnya terdengar menyesatkan seperti memutasi string: "Menghapus semua karakter spasi putih yang mengarah dan tertinggal dari objek String saat ini. "Jawaban:
Truncate()
Sayangnya, tidak ada metode pada string. Anda harus menulis logika semacam ini sendiri. Namun, yang dapat Anda lakukan adalah membungkusnya dengan metode ekstensi sehingga Anda tidak perlu menduplikasinya di mana saja:Sekarang kita bisa menulis:
sumber
maxLength
nilai negatif.Atau alih-alih operator ternary, Anda bisa menggunakan Math.min
sumber
value.Substring(0, value.Length)
.maxLength
nilai negatif.maxLength
ke0
atauvalue.Length
; atau saya perlu melemparArgumentOutOfRangeException
... yang lebih masuk akal dalam kasus ini, dan sudah terlemparSubstring
.return string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(value.Length, maxLength));
Saya pikir saya akan memasukkan implementasi saya karena saya percaya itu mencakup semua kasus yang telah disentuh oleh yang lain dan melakukannya dengan cara ringkas yang masih dapat dibaca.
Solusi ini terutama dibangun di atas solusi Ray dan membuka metode untuk digunakan sebagai metode ekstensi dengan menggunakan kata kunci ini seperti halnya LBushkin dalam solusinya.
sumber
maxLength
nilai negatif.Karena pengujian kinerja itu menyenangkan: (menggunakan metode ekstensi linqpad )
The
truncate
Metode adalah "signifikan" lebih cepat. #microoptimizationDini
Terlambat
Terlalu panjang
sumber
Di .NET 4.0 Anda dapat menggunakan
Take
metode ini:Tidak diuji efisiensi!
sumber
Anda bisa menggunakan LINQ ... itu menghilangkan kebutuhan untuk memeriksa panjang string. Memang mungkin bukan yang paling efisien, tapi itu menyenangkan.
atau
sumber
Saya melakukan milik saya dalam satu baris seperti ini
sumber
Sepertinya belum ada yang mengirim ini:
Menggunakan operator && menjadikannya sedikit lebih baik daripada jawaban yang diterima.
sumber
NET Framework. Memiliki API untuk memotong string seperti ini:
Tetapi dalam aplikasi C # Anda mungkin akan lebih memilih untuk roll sendiri daripada mengambil ketergantungan pada Microsoft.VisualBasic.dll, yang raison d'etre utamanya adalah kompatibilitas mundur.
sumber
Microsoft.VisualBasic.Strings
modul dalam. NET Core cukup kosong .Solusi lain:
sumber
Saya tahu ini adalah pertanyaan lama, tapi ini solusi yang bagus:
Pengembalian: halo ...
sumber
Varian serupa dengan operator propagasi Null C # 6
Harap dicatat, kami pada dasarnya memeriksa apakah
value
ada nol dua kali di sini.sumber
Masih tidak ada metode terpotong pada 2016 untuk string C #. Tapi - Menggunakan Sintaks C # 6.0:
Ini bekerja seperti pesona:
sumber
Mengambil @CaffGeek dan menyederhanakannya:
sumber
Kndly mencatat bahwa memotong string tidak hanya berarti memotong talinya pada panjang tertentu saja tetapi harus berhati-hati untuk tidak membagi kata.
mis. string: ini adalah string tes.
Saya ingin memotongnya jam 11. Jika kita menggunakan salah satu metode yang diberikan di atas hasilnya akan menjadi
ini adalah sebuah
Ini bukan hal yang kita inginkan
Metode yang saya gunakan mungkin juga tidak begitu sempurna tetapi dapat menangani sebagian besar situasi
sumber
Kenapa tidak:
yaitu dalam
value.Length < maxLength
ruang pad acara ke ujung atau memotong kelebihan.sumber
Kalau-kalau tidak ada jawaban yang cukup di sini, ini milik saya :)
menggunakan:
sumber
Demi kompleksitas (over), saya akan menambahkan versi kelebihan beban saya yang menggantikan 3 karakter terakhir dengan ellipsis sehubungan dengan parameter maxLength.
sumber
Dua sen saya dengan panjang contoh 30:
sumber
Saya lebih suka jawaban jpierson, tetapi tidak ada contoh di sini yang dapat saya lihat menangani parameter maxLength yang tidak valid, seperti ketika maxLength <0.
Pilihan akan berupa menangani kesalahan dalam mencoba / menangkap, menjepit parameter maxLength min ke 0, atau jika maxLength kurang dari 0 mengembalikan string kosong.
Tidak kode yang dioptimalkan:
sumber
Berikut ini adalah solusi vb.net, tandai bahwa pernyataan if (walaupun jelek) meningkatkan kinerja karena kita tidak memerlukan pernyataan substring ketika string sudah lebih kecil dari maxlength ... Dengan menjadikannya ekstensi ke string, mudah digunakan. ..
sumber
Saya tahu sudah ada banyak jawaban, tetapi kebutuhan saya adalah menjaga agar awal dan akhir string tetap pendek tetapi dipersingkat menjadi di bawah panjang maksimal.
Ini untuk membuat URL SharePoint yang memiliki panjang maksimal 260 karakter.
Saya tidak membuat panjang parameter karena ini adalah konstanta 260. Saya juga tidak membuat panjang substring pertama sebagai parameter karena saya ingin memecah pada titik tertentu. Akhirnya, substring kedua adalah panjang sumber - 20 karena saya tahu struktur folder.
Ini dapat dengan mudah disesuaikan dengan kebutuhan spesifik Anda.
sumber
Saya tahu sudah ada banyak jawaban di sini, tetapi ini adalah jawaban yang telah saya pakai, yang menangani string nol dan situasi di mana panjangnya negatif:
sumber
Di C # 8 fitur Ranges baru dapat digunakan ...
sumber
Tidak ada di .net untuk ini yang saya ketahui - ini adalah versi saya yang menambahkan "...":
sumber
TruncateString
sumber
Sebagai tambahan terhadap kemungkinan yang dibahas di atas, saya ingin membagikan solusi saya. Ini adalah metode ekstensi yang memungkinkan null (mengembalikan string.Empty) juga ada .Truncate () kedua untuk menggunakannya dengan ellipsis. Hati-hati, ini bukan kinerja yang dioptimalkan.
sumber
sumber
ToArray()
panggilan di sini overhead hanya perlu; menggunakan mis.String.Concat
Anda dapat membuat string dari enumerable karakter tanpa harus melalui array.String terpotong
sumber
Ini adalah kode yang biasanya saya gunakan:
sumber