Me gustaría escribir un método de extensión en la String
clase para que si la cadena de entrada es más larga que la longitud proporcionada N
, solo N
se mostrarán los primeros caracteres.
Así es como se ve:
public static string TruncateLongString(this string str, int maxLength)
{
if (str.Length <= maxLength)
return str;
else
//return the first maxLength characters
}
¿Qué String.*()
método puedo usar para obtener solo los primeros N
caracteres str
?
startIndex > (this.Length - length)
lanza unArgumentOutOfRangeException
.Math.Min(str.Length, maxLength) == str.Length
en caso de que termines creando una cadena innecesaria para devolver "la primera cadena. Caracteres largos de cadena", pero Substring hace esa verificación por ti y soloreturn this
si has pedido la cadena completa.Esta solución tiene una pequeña ventaja, ya que si n es mayor que s. Longitud, sigue haciendo lo correcto.
fuente
Puede usar LINQ
str.Take(n)
ostr.SubString(0, n)
, donde este último arrojará unaArgumentOutOfRangeException
excepción paran > str.Length
.Cuenta que la versión de LINQ devuelve una
IEnumerable<char>
, por lo que tendría que convertir elIEnumerable<char>
astring
:new string(s.Take(n).ToArray())
.fuente
Cada vez que tengo que hacer manipulaciones de cadenas en C #, echo de menos las funciones antiguas
Left
yRight
de Visual Basic, que son mucho más simples de usar queSubstring
.Entonces, en la mayoría de mis proyectos de C #, creo métodos de extensión para ellos:
Nota:
La
Math.Min
parte está ahí porqueSubstring
arroja unArgumentOutOfRangeException
cuando la longitud de la cadena de entrada es menor que la longitud solicitada, como ya se mencionó en algunos comentarios en las respuestas anteriores.Uso:
fuente
public static string Left(this string str, int length) { var Result = str.Substring(0, Math.Min(length, str.Length)); return (Result.Length < length) ? Result.PadRight(length) : Result; }
str
necesita ser verificado para nuloSimplemente:
fuente
fuente
str == null || str.Length <= maxLength
Remove
oSubstring
es mejor, no hay diferencia.Remove(maxLength)
solo llamaSubstring(0,maxLength)
después de un poco de verificación de límites. Lo que prefiera depende de si piensa en el truncamiento como "tomar los primeros caracteres maxLength" o "tirar todo después de los caracteres maxLength". Por supuesto, es realmente ambos, así que depende de ti.si hablamos de validaciones también por qué no hemos verificado entradas de cadena nulas. ¿Alguna razón específica?
Creo que a continuación se muestra ayuda, ya que IsNullOrEmpty es un método definido por el sistema y los operadores ternarios tienen una complejidad ciclomática = 1, mientras que si () {} más {} tiene el valor 2.
fuente
Agregué esto en mi proyecto solo porque donde lo estoy usando es una alta probabilidad de que se use en bucles, en un proyecto alojado en línea, por lo tanto, no quería ningún bloqueo si pudiera administrarlo. La longitud se ajusta a una columna que tengo. Es C # 7
Solo una línea:
fuente
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.
Escribí un blog sobre esto en mayo de 2010 en: http://jagdale.blogspot.com/2010/05/substring-extension-method-that-does.html
fuente
Parcialmente por el resumen (excluyendo la solución LINQ), aquí hay dos frases que abordan la
int maxLength
advertencia de permitir valores negativos y también el caso de una cadena nula:Substring
camino (de la respuesta de Paul Ruane ):Remove
camino (de la respuesta de kbrimington ):fuente
fuente
string.Substring (0, n); // 0 - índice de inicio yn - número de caracteres
fuente