यहां दो संभावित समाधान दिए गए हैं - एक LINQ वन-लाइनर इनपुट को बाएं से दाएं संसाधित करता है और एक पारंपरिक for
-लूप इनपुट को दाएं से बाएं प्रोसेस करता है। कौन सी प्रसंस्करण दिशा तेज है यह स्ट्रिंग की लंबाई, अनुमत बाइट लंबाई और मल्टीबाइट वर्णों की संख्या और वितरण पर निर्भर करता है और एक सामान्य सुझाव देना कठिन है। LINQ और पारंपरिक कोड I के बीच निर्णय शायद स्वाद (या शायद गति) का मामला है।
यदि गति मायने रखती है, तो प्रत्येक पुनरावृत्ति में पूरे स्ट्रिंग की बाइट लंबाई की गणना करने के बजाय अधिकतम लंबाई तक पहुंचने तक प्रत्येक वर्ण की बाइट लंबाई जमा करने के बारे में सोच सकता है। लेकिन मुझे यकीन नहीं है कि यह काम करेगा क्योंकि मुझे यूटीएफ -8 एन्कोडिंग अच्छी तरह से नहीं पता है। मैं सैद्धांतिक रूप से कल्पना कर सकता था कि एक स्ट्रिंग की बाइट लंबाई सभी वर्णों की बाइट लंबाई के योग के बराबर नहीं होती है।
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;
}