Phương thức Chuỗi con .NET đầy rủi ro. Tôi đã phát triển các phương thức mở rộng xử lý nhiều tình huống khác nhau. Điều tuyệt vời là nó bảo toàn hành vi ban đầu, nhưng khi bạn thêm một tham số "đúng" bổ sung, thì nó sử dụng phương thức mở rộng để xử lý ngoại lệ và trả về các giá trị logic nhất, dựa trên chỉ số và độ dài. Ví dụ: nếu độ dài là âm và đếm ngược. Bạn có thể xem kết quả kiểm tra với nhiều giá trị khác nhau trên fiddle tại: https://dotnetfiddle.net/m1mSH9 . Điều này sẽ cung cấp cho bạn một ý tưởng rõ ràng về cách nó giải quyết các chất nền.
Tôi luôn thêm các phương thức này vào tất cả các dự án của mình và không bao giờ phải lo lắng về việc phá mã, bởi vì có gì đó đã thay đổi và chỉ mục không hợp lệ. Dưới đây là mã.
public static String Substring(this String val, int startIndex, bool handleIndexException)
{
if (!handleIndexException)
{ //handleIndexException is false so call the base method
return val.Substring(startIndex);
}
if (string.IsNullOrEmpty(val))
{
return val;
}
return val.Substring(startIndex < 0 ? 0 : startIndex > (val.Length - 1) ? val.Length : startIndex);
}
public static String Substring(this String val, int startIndex, int length, bool handleIndexException)
{
if (!handleIndexException)
{ //handleIndexException is false so call the base method
return val.Substring(startIndex, length);
}
if (string.IsNullOrEmpty(val))
{
return val;
}
int newfrom, newlth, instrlength = val.Length;
if (length < 0) //length is negative
{
newfrom = startIndex + length;
newlth = -1 * length;
}
else //length is positive
{
newfrom = startIndex;
newlth = length;
}
if (newfrom + newlth < 0 || newfrom > instrlength - 1)
{
return string.Empty;
}
if (newfrom < 0)
{
newlth = newfrom + newlth;
newfrom = 0;
}
return val.Substring(newfrom, Math.Min(newlth, instrlength - newfrom));
}
Tôi đã viết về điều này vào tháng 5 năm 2010 tại: http://jagdale.blogspot.com/2010/05/subopes-extension-method-that-does.html