Berikut adalah dua solusi yang mungkin - LINQ one-liner memproses input dari kiri ke kanan dan for
tradisional -loop memproses input dari kanan ke kiri. Arah pemrosesan mana yang lebih cepat tergantung pada panjang string, panjang byte yang diizinkan, dan jumlah serta distribusi karakter multibyte dan sulit untuk memberikan saran umum. Keputusan antara LINQ dan kode tradisional Saya mungkin masalah selera (atau mungkin kecepatan).
Jika kecepatan penting, orang dapat berpikir tentang hanya mengumpulkan panjang byte dari setiap karakter hingga mencapai panjang maksimum daripada menghitung panjang byte dari seluruh string di setiap iterasi. Tetapi saya tidak yakin apakah ini akan berhasil karena saya tidak tahu pengkodean UTF-8 dengan cukup baik. Secara teoritis saya dapat membayangkan bahwa panjang byte string tidak sama dengan jumlah panjang byte semua karakter.
public static String LimitByteLength(String input, Int32 maxLength)
{
return new String(input
.TakeWhile((c, i) =>
Encoding.UTF8.GetByteCount(input.Substring(0, i + 1)) <= maxLength)
.ToArray());
}
public static String LimitByteLength2(String input, Int32 maxLength)
{
for (Int32 i = input.Length - 1; i >= 0; i--)
{
if (Encoding.UTF8.GetByteCount(input.Substring(0, i + 1)) <= maxLength)
{
return input.Substring(0, i + 1);
}
}
return String.Empty;
}