Метод .NET Substring загрожує небезпекою. Я розробив методи розширення, які обробляють найрізноманітніші сценарії. Приємно, що вона зберігає оригінальну поведінку, але коли ви додаєте додатковий параметр "true", тоді він вдається до методу розширення для обробки винятку і повертає найбільш логічні значення на основі індексу та довжини. Наприклад, якщо довжина від’ємна і вважається зворотною. Ви можете переглянути результати тесту з найрізноманітнішими значеннями на скрипці за посиланням: https://dotnetfiddle.net/m1mSH9 . Це дасть вам чітке уявлення про те, як вона розв’язує підрядки.
Я завжди додаю ці методи до всіх своїх проектів, і ніколи не потрібно хвилюватися про порушення коду, тому що щось змінилося, а індекс недійсний. Нижче наведено код.
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));
}
Я розповів про це ще в травні 2010 року за адресою: http://jagdale.blogspot.com/2010/05/substring-extension-method-that-does.html