Saya ingin menulis metode ekstensi ke String
kelas sehingga jika string input lebih panjang dari panjang yang disediakan N
, hanya N
karakter pertama yang akan ditampilkan.
Begini tampilannya:
public static string TruncateLongString(this string str, int maxLength)
{
if (str.Length <= maxLength)
return str;
else
//return the first maxLength characters
}
String.*()
Metode apa yang bisa saya gunakan untuk mendapatkan hanya N
karakter pertama str
?
startIndex > (this.Length - length)
melemparArgumentOutOfRangeException
.Math.Min(str.Length, maxLength) == str.Length
Anda akhirnya membuat string yang tidak perlu untuk mengembalikan "str pertama. Karakter panjang str", tetapi Substring yang memeriksa untuk Anda dan hanyareturn this
jika Anda telah meminta seluruh string.Solusi ini memiliki bonus kecil yaitu jika n lebih besar dari s. Panjang, itu masih melakukan hal yang benar.
sumber
Anda dapat menggunakan LINQ
str.Take(n)
ataustr.SubString(0, n)
, di mana yang terakhir akan melemparkanArgumentOutOfRangeException
pengecualiann > str.Length
.Diingat bahwa versi LINQ mengembalikan
IEnumerable<char>
, sehingga Anda harus mengkonversiIEnumerable<char>
kestring
:new string(s.Take(n).ToArray())
.sumber
Setiap kali saya harus melakukan manipulasi string dalam C #, saya kehilangan fungsi lama
Left
danRight
baik dari Visual Basic, yang jauh lebih mudah digunakan daripadaSubstring
.Jadi di sebagian besar proyek C # saya, saya membuat metode ekstensi untuk mereka:
Catatan:
Bagian
Math.Min
itu ada karenaSubstring
melemparArgumentOutOfRangeException
ketika panjang string input lebih kecil dari panjang yang diminta, seperti yang telah disebutkan dalam beberapa komentar di bawah jawaban sebelumnya.Pemakaian:
sumber
public static string Left(this string str, int length) { var Result = str.Substring(0, Math.Min(length, str.Length)); return (Result.Length < length) ? Result.PadRight(length) : Result; }
str
perlu diperiksa untuk nullSecara sederhana:
sumber
sumber
str == null || str.Length <= maxLength
Remove
atauSubstring
lebih baik, tidak ada perbedaan.Remove(maxLength)
hanya meneleponSubstring(0,maxLength)
setelah sedikit batas memeriksa. Yang Anda inginkan tergantung pada apakah Anda menganggap pemotongan sebagai "ambil karakter maxLength pertama" atau "buang semuanya setelah karakter maxLength". Tentu saja, itu benar-benar berdua sehingga terserah Anda.jika kita berbicara tentang validasi juga mengapa kita belum memeriksa entri string nol. Adakah alasan khusus?
Saya pikir cara di bawah ini membantu karena IsNullOrEmpty adalah metode yang ditentukan sistem dan operator ternary memiliki kompleksitas siklomatik = 1 sementara if () {} else {} memiliki nilai 2.
sumber
Saya menambahkan ini dalam proyek saya hanya karena di mana saya menggunakannya adalah kemungkinan besar itu digunakan dalam loop, dalam proyek yang dihosting online maka saya tidak ingin ada crash jika saya bisa mengelolanya. Panjangnya cocok dengan kolom yang saya miliki. Ini C # 7
Hanya satu baris:
sumber
Metode .NET Substring penuh dengan bahaya. Saya mengembangkan metode ekstensi yang menangani berbagai skenario. Yang menyenangkan adalah ia mempertahankan perilaku asli, tetapi ketika Anda menambahkan parameter "true" tambahan, ia kemudian beralih ke metode ekstensi untuk menangani pengecualian, dan mengembalikan nilai yang paling logis, berdasarkan indeks dan panjangnya. Misalnya, jika panjangnya negatif, dan dihitung mundur. Anda dapat melihat hasil tes dengan berbagai nilai pada biola di: https://dotnetfiddle.net/m1mSH9 . Ini akan memberi Anda gagasan yang jelas tentang cara menyelesaikan substring.
Saya selalu menambahkan metode ini ke semua proyek saya, dan tidak perlu khawatir tentang pemecahan kode, karena sesuatu berubah dan indeks tidak valid. Di bawah ini adalah kode.
Saya membuat blog tentang ini kembali pada Mei 2010 di: http://jagdale.blogspot.com/2010/05/substring-extension-method-that-does.html
sumber
Sebagian demi peringkasan (tidak termasuk solusi LINQ), berikut adalah dua one-liner yang membahas
int maxLength
peringatan yang memungkinkan nilai negatif dan juga kasus string nol:Substring
cara (dari jawaban Paul Ruane ini ):Remove
cara (dari jawaban kbrimington ini ):sumber
sumber
string. Substring (0, n); // 0 - indeks awal dan n - jumlah karakter
sumber