Hier zijn twee mogelijke oplossingen:een LINQ one-liner die de invoer van links naar rechts verwerkt en een traditionele for
-loop verwerking van de invoer van rechts naar links. Welke verwerkingsrichting sneller is, hangt af van de stringlengte, de toegestane bytelengte en het aantal en de distributie van multibyte-tekens en is moeilijk een algemene suggestie te geven. De keuze tussen LINQ en traditionele code is waarschijnlijk een kwestie van smaak (of misschien snelheid).
Als snelheid van belang is, zou je kunnen overwegen om de bytelengte van elk teken te accumuleren totdat de maximale lengte is bereikt, in plaats van de bytelengte van de hele string in elke iteratie te berekenen. Maar ik weet niet zeker of dit zal werken omdat ik UTF-8-codering niet goed genoeg ken. Ik zou me theoretisch kunnen voorstellen dat de bytelengte van een string niet gelijk is aan de som van de bytelengtes van alle karakters.
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;
}