El método de .NET Substring está lleno de peligros. Desarrollé métodos de extensión que manejan una amplia variedad de escenarios. Lo bueno es que conserva el comportamiento original, pero cuando agrega un parámetro "verdadero" adicional, recurre al método de extensión para manejar la excepción y devuelve los valores más lógicos, en función del índice y la longitud. Por ejemplo, si la longitud es negativa y cuenta hacia atrás. Puede ver los resultados de la prueba con una amplia variedad de valores en el violín en: https://dotnetfiddle.net/m1mSH9 . Esto le dará una idea clara de cómo resuelve las subcadenas.
Siempre agrego estos métodos a todos mis proyectos, y nunca tengo que preocuparme por la ruptura del código, porque algo cambió y el índice no es válido. Debajo está el código.
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));
}
Escribí un blog sobre esto en mayo de 2010 en: http://jagdale.blogspot.com/2010/05/substring-extension-method-that-does.html