.NET Substring yöntemi tehlikeyle doludur. Çok çeşitli senaryoları ele alan uzatma yöntemleri geliştirdim. Güzel bir şey, orijinal davranışı korur, ancak ek bir "true" parametresi eklediğinizde, istisnayı işlemek için uzantı yöntemine başvurur ve dizin ve uzunluğa bağlı olarak en mantıklı değerleri döndürür. Örneğin, uzunluk negatifse ve geriye doğru sayarsa. Test sonuçlarına çok çeşitli değerlerle bakabilirsiniz: https://dotnetfiddle.net/m1mSH9 . Bu size alt dizeleri nasıl çözdüğü konusunda net bir fikir verecektir.
Bu yöntemleri her zaman tüm projelerime ekliyorum ve asla kod kırma konusunda endişelenmem gerekiyor, çünkü bir şey değişti ve dizin geçersiz. Kod aşağıdadır.
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));
}
Mayıs 2010'da bu konuda blog yazdım: http://jagdale.blogspot.com/2010/05/substring-extension-method-that-does.html