Bagaimana cara memotong string .NET?

406

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 maxLengthumumnya 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?

Steve Guidi
sumber
24
Sebagai catatan, string tidak dapat diubah Anda tidak dapat memotongnya, Anda hanya dapat mengembalikan salinannya yang terpotong. Nitpicky, saya tahu.
John Weldon
2
@ John Weldon: Itu mungkin mengapa fungsi anggota tidak ada - tidak mengikuti semantik dari tipe data. Di samping catatan, StringBuildermemungkinkan Anda memotong dengan memendekkan panjang, tetapi Anda masih perlu melakukan pemeriksaan panjang untuk menghindari pelebaran string.
Steve Guidi
1
Solusi mana pun yang Anda pilih, pastikan untuk menambahkan tanda centang untuk string nol sebelum memanggil Substring atau mengakses properti Length.
Ray
3
@SteveGuidi - Jika itu masalahnya, maka tidak akan ada fungsi seperti Trim atau Ganti, yang menghadapi masalah semantik serupa
Chris Rogers
1
@JohnWeldon Secara konsisten, nitpicky daripada Microsoft sendiri secara konsisten, mereka senang mendokumentasikan, misalnya, .Trim()dengan cara yang membuatnya terdengar menyesatkan seperti memutasi string: "Menghapus semua karakter spasi putih yang mengarah dan tertinggal dari objek String saat ini. "
Mark Amery

Jawaban:

620

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:

public static class StringExt
{
    public static string Truncate(this string value, int maxLength)
    {
        if (string.IsNullOrEmpty(value)) return value;
        return value.Length <= maxLength ? value : value.Substring(0, maxLength); 
    }
}

Sekarang kita bisa menulis:

var someString = "...";
someString = someString.Truncate(2);
LBushkin
sumber
5
Solusi Hebat, tetapi ingat ini hanya berfungsi di NET 3.5 dan Atas. Jangan mencobanya di NET2.0.
Jedi Master Spooky
7
Selama Anda berada di VS 2008, dan mungkin VS 2010, Anda masih bisa melakukan ini bahkan jika menargetkan .Net 2.0. danielmoth.com/Blog/…
Mark
4
Ini akan gagal ketika maxLengthnilai negatif.
Bernard
42
@Bardard, ini seharusnya gagal jika maxLength negatif. Perilaku lain apa pun tidak terduga.
bojingo
12
Anda dapat memanggil metode ekstensi dengan nilai nol.
Joel Malone
127

Atau alih-alih operator ternary, Anda bisa menggunakan Math.min

public static class StringExt
{
    public static string Truncate( this string value, int maxLength )
    {
        if (string.IsNullOrEmpty(value)) { return value; }

        return value.Substring(0, Math.Min(value.Length, maxLength));
    }
}
CaffGeek
sumber
10
Pintar! Dan ekspresi berikut dioptimalkan untuk kembali referensi ke string asli: value.Substring(0, value.Length).
Steve Guidi
4
Sayangnya itu tidak dioptimalkan untuk kasus-kasus di mana nilai. Panjang kurang dari MaxLength yang mungkin merupakan kasus umum di beberapa data. Juga properti Panjang pada string harus dikapitalisasi.
jpierson
1
Ini akan gagal ketika maxLengthnilai negatif.
Bernard
7
@Bernard, jadi akan banyak hal dalam kerangka ... tetapi jika saya memeriksanya ... saya harus default maxLengthke 0atau value.Length; atau saya perlu melempar ArgumentOutOfRangeException... yang lebih masuk akal dalam kasus ini, dan sudah terlempar Substring.
CaffGeek
2
Sedikit lebih pendek:return string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(value.Length, maxLength));
user1127860
43

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.

public static string Truncate(this string value, int maxLength)
{
    if (!string.IsNullOrEmpty(value) && value.Length > maxLength)
    {
        return value.Substring(0, maxLength);
    }

    return value;
}

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.

jpierson
sumber
Ini akan gagal ketika maxLengthnilai negatif.
Bernard
15
@Bernard - Saya akan merekomendasikan untuk tidak melewatkan nilai negatif untuk argumen maxLength karena merupakan nilai yang tidak terduga. Metode Substring mengambil pendekatan yang sama sehingga tidak ada alasan untuk meningkatkan pengecualian yang dilemparnya.
jpierson
Saya rasa pemeriksaan IsNullOrEmpty tidak diperlukan? (1) Jika nilainya nol, seharusnya tidak ada cara untuk memanggil metode ekstensi ini di atasnya. (2) Jika nilainya adalah string kosong, nilai.Length> maxLength check akan gagal.
Jon Schneider
8
@JonSchneider, IsNullOrEmpty diperlukan karena ini adalah metode ekstensi. Jika Anda memiliki variabel tipe string yang telah ditetapkan sebagai null, kompiler tidak memasukkan cek nol sebelum memanggil metode ini. Secara teknis, ini masih merupakan metode statis dari kelas statis. Jadi: stringVar.Truncate (2) Mengkompilasi sebagai: StringExt.Truncate (stringVar, 2);
Jeff B
40

Karena pengujian kinerja itu menyenangkan: (menggunakan metode ekstensi linqpad )

var val = string.Concat(Enumerable.Range(0, 50).Select(i => i % 10));

foreach(var limit in new[] { 10, 25, 44, 64 })
    new Perf<string> {
        { "newstring" + limit, n => new string(val.Take(limit).ToArray()) },
        { "concat" + limit, n => string.Concat(val.Take(limit)) },
        { "truncate" + limit, n => val.Substring(0, Math.Min(val.Length, limit)) },
        { "smart-trunc" + limit, n => val.Length <= limit ? val : val.Substring(0, limit) },
        { "stringbuilder" + limit, n => new StringBuilder(val, 0, Math.Min(val.Length, limit), limit).ToString() },
    }.Vs();

The truncateMetode adalah "signifikan" lebih cepat. #microoptimization

Dini

  • truncate10 5788 ticks berlalu (0,5788 ms) [dalam 10K repetisi, 5,788E-05 ms per]
  • smart-trunc10 8206 ticks berlalu (0,8206 ms) [dalam 10K repetisi, 8,206E-05 ms per]
  • stringbuilder10 10557 ticks berlalu (1,0557 ms) [dalam 10K repetisi, 0,00010557 ms per]
  • concat10 45495 ticks berlalu (4.5495 ms) [dalam 10K repetisi, 0,00045495 ms per]
  • newstring10 72535 ticks berlalu (7.2535 ms) [dalam 10K repetisi, 0,00072535 ms per]

Terlambat

  • truncate44 8835 ticks berlalu (0,8835 ms) [dalam 10K repetisi, 8,835E-05 ms per]
  • stringbuilder44 13106 ticks berlalu (1,3106 ms) [dalam 10K repetisi, 0,00013106 ms per]
  • smart-trunc44 14821 ticks berlalu (1,4821 ms) [dalam 10K repetisi, 0,00014821 ms per]
  • kutu newstring44 144324 berlalu (14,4324 ms) [dalam 10K repetisi, 0,00144324 ms per]
  • concat44 174610 ticks berlalu (17.461 ms) [dalam 10K repetisi, 0,0017461 ms per]

Terlalu panjang

  • smart-trunc64 6944 ticks berlalu (0,6944 ms) [dalam 10K repetisi, 6,944E-05 ms per]
  • truncate64 7686 ticks berlalu (0,7686 ms) [dalam 10K repetisi, 7,686E-05 ms per]
  • stringbuilder64 13314 ticks berlalu (1,3314 ms) [dalam 10K repetisi, 0,00013314 ms per]
  • newstring64 177481 ticks berlalu (17.7481 ms) [dalam 10K repetisi, 0,00177481 ms per]
  • concat64 241601 ticks elapsed (24.1601 ms) [dalam 10K repetisi, 0,00241601 ms per]
drzaus
sumber
Terima kasih untuk semua tolok ukur yang berguna! ... dan batu-batu Linkpad!
Sunsetquest
tidak pernah keberatan bahwa linqpad dapat melakukan hal-hal itu
jefissu
38

Di .NET 4.0 Anda dapat menggunakan Takemetode ini:

string.Concat(myString.Take(maxLength));

Tidak diuji efisiensi!

Dylan Nicholson
sumber
27

Anda bisa menggunakan LINQ ... itu menghilangkan kebutuhan untuk memeriksa panjang string. Memang mungkin bukan yang paling efisien, tapi itu menyenangkan.

string result = string.Join("", value.Take(maxLength)); // .NET 4 Join

atau

string result = new string(value.Take(maxLength).ToArray());
jinak
sumber
2
mengapa ini bukan jawaban yang diterima? Apa yang paling mudah, menulis metode Ekstensi Anda sendiri yang perlu Anda pertahankan / dokumentasikan, atau gunakan sesuatu seperti BUILT IN. Take
Don Cheadle
9
@mmcrae Linq mungkin lebih lurus ke depan, tetapi juga jauh lebih lambat. Benchmark saya mengatakan ~ 400ms untuk Linq dan hanya ~ 24ms untuk Substring untuk 1 juta iterasi.
Hein Andre Grønnestad
Solusi ini seharusnya tidak pernah digunakan. Seperti yang dikatakan dalam dua komentar di atas, selalu ada alokasi memori, bahkan ketika string yang ada tidak lebih besar dari panjang maks. Juga sangat lambat.
Kamarey
15

Saya melakukan milik saya dalam satu baris seperti ini

value = value.Length > 1000 ? value.Substring(0, 1000) : value;
SeanMC
sumber
2
-1; ini tidak menambahkan apa pun yang belum ada dalam jawaban yang diterima.
Mark Amery
2
@markamery ini adalah alternatif yang lebih pendek dengan lebih sedikit kode untuk ditulis dan diperbarui ketika Anda perlu menggunakannya. Tidak suka itu Jangan gunakan itu
SeanMC
Cepat, sederhana, dan cepat. Inilah yang saya butuhkan. Terima kasih!
Peter
14

Sepertinya belum ada yang mengirim ini:

public static class StringExt
{
    public static string Truncate(this string s, int maxLength)
    {
        return s != null && s.Length > maxLength ? s.Substring(0, maxLength) : s;
    }
}

Menggunakan operator && menjadikannya sedikit lebih baik daripada jawaban yang diterima.

Darren
sumber
13

NET Framework. Memiliki API untuk memotong string seperti ini:

Microsoft.VisualBasic.Strings.Left(string, int);

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.

Joe
sumber
"Framework .NET memiliki API" Anda menentang diri Anda sendiri. Itu adalah VB.NET API
Camilo Terevinto
9
@CamiloTerevinto - ini adalah API yang dikirimkan bersama dengan .NET Framework, dan dapat dipanggil dari bahasa yang dikelola.
Joe
1
VB DLL memiliki banyak hal bagus di dalamnya. Mengapa begitu banyak c # devs yang menentangnya?
Michael Z.
Sayangnya, tidak ada dukungan .NET Core. Memang, seluruh Microsoft.VisualBasic.Stringsmodul dalam. NET Core cukup kosong .
Mark Amery
1
Sementara saya setuju dengan komentar Joe, masih saya merasa tidak benar memanggil sesuatu yang spesifik untuk VB dari bahasa lain. Jika ada begitu banyak hal bagus di "VB DLL", mengapa tidak meletakkannya di beberapa tempat bersama? Siapa yang tahu apa yang akan dilakukan Microsoft dengan barang-barang ini besok? Hentikan dukungan atau sesuatu ..
Kamarey
12

Solusi lain:

return input.Substring(0, Math.Min(input.Length, maxLength));
Marek Malczewski
sumber
6

Saya tahu ini adalah pertanyaan lama, tapi ini solusi yang bagus:

public static string Truncate(this string text, int maxLength, string suffix = "...")
{
    string str = text;
    if (maxLength > 0)
    {
        int length = maxLength - suffix.Length;
        if (length <= 0)
        {
            return str;
        }
        if ((text != null) && (text.Length > maxLength))
        {
            return (text.Substring(0, length).TrimEnd(new char[0]) + suffix);
        }
    }
    return str;
}

var myString = "hello world"
var myTruncatedString = myString.Truncate(4);

Pengembalian: halo ...

nologo
sumber
@SarjanWebDev Karakter khusus itu muncul sebagai "." dalam cmd.exe
Neal Ehardt
5

Varian serupa dengan operator propagasi Null C # 6

public static string Truncate(this string value, int maxLength)
{
    return value?.Length <= maxLength ? value : value?.Substring(0, maxLength);
}

Harap dicatat, kami pada dasarnya memeriksa apakah valueada nol dua kali di sini.

Jamie Rees
sumber
5

Masih tidak ada metode terpotong pada 2016 untuk string C #. Tapi - Menggunakan Sintaks C # 6.0:

public static class StringExtension
{
  public static string Truncate(this string s, int max) 
  { 
    return s?.Length > max ? s.Substring(0, max) : s ?? throw new ArgumentNullException(s); 
  }
}

Ini bekerja seperti pesona:

"Truncate me".Truncate(8);
Result: "Truncate"
Tobias Schiele
sumber
4

Mengambil @CaffGeek dan menyederhanakannya:

public static string Truncate(this string value, int maxLength)
    {
        return string.IsNullOrEmpty(value) ? value : value.Substring(0, Math.Min(value.Length, maxLength));
    }
Edwin Beltran
sumber
4

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

public string CutString(string source, int length)
{
        if (source== null || source.Length < length)
        {
            return source;
        }
        int nextSpace = source.LastIndexOf(" ", length);
        return string.Format("{0}...", input.Substring(0, (nextSpace > 0) ? nextSpace : length).Trim());
} 
Sen K. Mathew
sumber
4

Kenapa tidak:

string NormalizeLength(string value, int maxLength)
{
    //check String.IsNullOrEmpty(value) and act on it. 
    return value.PadRight(maxLength).Substring(0, maxLength);
}

yaitu dalam value.Length < maxLengthruang pad acara ke ujung atau memotong kelebihan.

Sri
sumber
Anda menghasilkan objek string dua kali lebih banyak dan itu bisa melempar NullReferenceException dari panggilan PadRight jika nilai null yang tidak pantas, itu harus menjadi ArgumentNullException.
Jeremy
1
@ Jeremy Saya tidak mengerti "ini bisa melempar NullReferenceException dari panggilan PadRight jika nilainya nol"; belumkah saya menyebutkan "// check string.IsNullOrEmpty (value) dan tindak lanjuti."
Sri
3

Kalau-kalau tidak ada jawaban yang cukup di sini, ini milik saya :)

public static string Truncate(this string str, 
                              int totalLength, 
                              string truncationIndicator = "")
{
    if (string.IsNullOrEmpty(str) || str.Length < totalLength) 
        return str;

    return str.Substring(0, totalLength - truncationIndicator.Length) 
           + truncationIndicator;
}

menggunakan:

"I use it like this".Truncate(5,"~")
KR
sumber
2

Demi kompleksitas (over), saya akan menambahkan versi kelebihan beban saya yang menggantikan 3 karakter terakhir dengan ellipsis sehubungan dengan parameter maxLength.

public static string Truncate(this string value, int maxLength, bool replaceTruncatedCharWithEllipsis = false)
{
    if (replaceTruncatedCharWithEllipsis && maxLength <= 3)
        throw new ArgumentOutOfRangeException("maxLength",
            "maxLength should be greater than three when replacing with an ellipsis.");

    if (String.IsNullOrWhiteSpace(value)) 
        return String.Empty;

    if (replaceTruncatedCharWithEllipsis &&
        value.Length > maxLength)
    {
        return value.Substring(0, maxLength - 3) + "...";
    }

    return value.Substring(0, Math.Min(value.Length, maxLength)); 
}
SoftDev
sumber
2

Dua sen saya dengan panjang contoh 30:

  var truncatedInput = string.IsNullOrEmpty(input) ? 
      string.Empty : 
      input.Substring(0, Math.Min(input.Length, 30));
Ognyan Dimitrov
sumber
1

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:

public string Truncate(this string value, int maximumLength)
{
    if (string.IsNullOrEmpty(value) == true) { return value; }
    if (maximumLen < 0) { return String.Empty; }
    if (value.Length > maximumLength) { return value.Substring(0, maximumLength); }
    return value;
}
Deegee
sumber
3
Catatan, bahwa dalam implementasi saya, saya memilih untuk tidak menangani kasus di mana maksimumLength kurang dari 0 karena saya pikir satu-satunya hal yang akan saya lakukan adalah melempar ArgumentOutOfRangeExcpetion yang pada dasarnya apa yang string.Substring () lakukan untuk saya.
jpierson
1

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. ..

 <System.Runtime.CompilerServices.Extension()> _
    Public Function Truncate(String__1 As String, maxlength As Integer) As String
        If Not String.IsNullOrEmpty(String__1) AndAlso String__1.Length > maxlength Then
            Return String__1.Substring(0, maxlength)
        Else
            Return String__1
        End If
    End Function
Jeroen Bom
sumber
Di VB.net Anda dapat mengganti "Bukan String.IsNullOrEmpty (String__1)" dengan "String__1 <> Tidak Ada". Ini sedikit lebih pendek. Nilai default untuk string adalah string kosong. Menggunakan "<> Tidak Ada" memeriksa null dan kasing kosong Uji dengan: Truncate ("", 50) dan Truncate (Nothing, 50)
jrjensen
Di VB Anda dapat melakukan Kiri (string, maxlength)
Michael Z.
1

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.

    public static string TruncateMiddle(string source)
    {
        if (String.IsNullOrWhiteSpace(source) || source.Length < 260) 
            return source;

        return string.Format("{0}...{1}", 
            source.Substring(0, 235),
            source.Substring(source.Length - 20));
    }

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.

Paul Haan
sumber
1

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:

public static string Truncate(this string s, int length)
{
    return string.IsNullOrEmpty(s) || s.Length <= length ? s 
        : length <= 0 ? string.Empty 
        : s.Substring(0, length);
}
Ed B
sumber
1

Di C # 8 fitur Ranges baru dapat digunakan ...

value = value[..Math.Min(30, value.Length)];
Sunsetquest
sumber
0

Tidak ada di .net untuk ini yang saya ketahui - ini adalah versi saya yang menambahkan "...":

public static string truncateString(string originalString, int length) {
  if (string.IsNullOrEmpty(originalString)) {
   return originalString;
  }
  if (originalString.Length > length) {
   return originalString.Substring(0, length) + "...";
  }
  else {
   return originalString;
  }
}
sinar
sumber
2
Versi Anda akan memberikan string yang 3 karakter lebih panjang dari panjang yang diminta, kalau-kalau terpotong. Selain itu, triple dots benar-benar hanya bermakna dalam representasi, saya tidak akan menyimpannya dalam database seperti itu yang merupakan use case yang diberikan OP.
MarioDS
0

TruncateString

public static string _TruncateString(string input, int charaterlimit)
{
    int characterLimit = charaterlimit;
    string output = input;

    // Check if the string is longer than the allowed amount
    // otherwise do nothing
    if (output.Length > characterLimit && characterLimit > 0)
    {
        // cut the string down to the maximum number of characters
        output = output.Substring(0, characterLimit);
        // Check if the character right after the truncate point was a space
        // if not, we are in the middle of a word and need to remove the rest of it
        if (input.Substring(output.Length, 1) != " ")
        {
            int LastSpace = output.LastIndexOf(" ");

            // if we found a space then, cut back to that space
            if (LastSpace != -1)
            {
                output = output.Substring(0, LastSpace);
            }
        }
        // Finally, add the "..."
        output += "...";
    }
    return output;
}
Sud
sumber
2
Mengapa Anda mendahului nama metode publik Anda dengan garis bawah?
Michael Z.
0

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.

public static string Truncate(this string value, int maxLength) =>
    (value ?? string.Empty).Substring(0, (value?.Length ?? 0) <= (maxLength < 0 ? 0 : maxLength) ? (value?.Length ?? 0) : (maxLength < 0 ? 0 : maxLength));
public static string Truncate(this string value, int maxLength, string ellipsis) =>
    string.Concat(value.Truncate(maxLength - (((value?.Length ?? 0) > maxLength ? ellipsis : null)?.Length ?? 0)), ((value?.Length ?? 0) > maxLength ? ellipsis : null)).Truncate(maxLength);
Raymond Osterbrink
sumber
-1
public static string Truncate( this string value, int maxLength )
    {
        if (string.IsNullOrEmpty(value)) { return value; }

        return new string(value.Take(maxLength).ToArray());// use LINQ and be happy
    }
TapiokaCom
sumber
The ToArray()panggilan di sini overhead hanya perlu; menggunakan mis. String.ConcatAnda dapat membuat string dari enumerable karakter tanpa harus melalui array.
Mark Amery
-3

String terpotong

public static string TruncateText(string strText, int intLength)
{
    if (!(string.IsNullOrEmpty(strText)))
    {                                
        // split the text.
        var words = strText.Split(' ');

        // calculate the number of words
        // based on the provided characters length 
        // use an average of 7.6 chars per word.
        int wordLength = Convert.ToInt32(Math.Ceiling(intLength / 7.6));

        // if the text is shorter than the length,
        // display the text without changing it.
        if (words.Length <= wordLength)
            return strText.Trim();                

        // put together a shorter text
        // based on the number of words
        return string.Join(" ", words.Take(wordLength)) + " ...".Trim();
    }
        else
        {
            return "";
        }            
    }
VT
sumber
Ini tidak menjawab pertanyaan OP. Pertama, itu harus menjadi fungsi anggota (meskipun Anda telah menulisnya sebagai metode ekstensi). Kedua, OP tidak menentukan bahwa teks harus dipisah dan kata-kata dipotong untuk kira-kira. 7,6 karakter per kata.
Wicher Visser
7.6 hanyalah sebuah angka. Anda dapat menulis nomor lain yang Anda inginkan. Ini kebetulan merupakan panjang rata-rata kata bahasa Inggris. Saya menemukannya di google. Menggunakan split hanyalah cara mudah untuk memecah kata-kata berdasarkan ruang. Saya tidak berpikir bahwa Anda ingin menampilkan setengah kata! Jadi, kecuali Anda mengulang untuk menemukan ruang kosong yang membutuhkan lebih banyak kode, ini adalah cara mudah untuk memotong string dan menampilkan kata-kata penuh. Ini akan memastikan Anda bahwa string tidak lebih panjang dari panjang yang diberikan dan Anda tidak akan memiliki kata-kata patah.
VT
-4

Ini adalah kode yang biasanya saya gunakan:

string getSubString(string value, int index, int length)
        {
            if (string.IsNullOrEmpty(value) || value.Length <= length)
            {
                return value;
            }
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            for (int i = index; i < length; i++)
            {
                sb.AppendLine(value[i].ToString());
            }
            return sb.ToString();
        }
pengguna3390116
sumber
5
Harap dicatat bahwa string gabungan dengan + = adalah operasi yang mahal, terutama ketika membangun kembali karakter demi karakter. .NET string tidak dapat diubah, yang berarti dalam kasus ini, string baru dibuat setiap kali di loop Anda.
Steve Guidi
@SteveGuidi string tidak bisa diubah, mereka hanya menyamar sebagai tidak berubah. Saya berharap string adalah primitif abadi sejati sehingga saya dapat memiliki string dan string ?, tapi sayangnya mereka bukan primitif.
Chris Marisic
Anda mengatakan mahal seolah-olah biaya kinerja signifikan, saya mengubahnya menggunakan stringBuilder tapi saya menemukan bahwa dengan + = lebih mudah untuk melihat apa yang terjadi, saya hanya ingin OP dengan mudah memahami kode.
user3390116