¿Qué método en la clase String solo devuelve los primeros N caracteres?

Me gustaría escribir un método de extensión para la clase String modo que si la cadena de entrada a es más larga que la longitud N proporcionada, solo se muestren los primeros N 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é método String.*() Puedo usar para obtener solo los primeros N caracteres de str ?

 public static string TruncateLongString(this string str, int maxLength) { if (string.IsNullOrEmpty(str)) return str; return str.Substring(0, Math.Min(str.Length, maxLength)); } 
 string truncatedToNLength = new string(s.Take(n).ToArray()); 

Esta solución tiene una pequeña ventaja en que si n es mayor que la longitud, todavía hace lo correcto.

Puede usar LINQ str.Take(n) o str.SubString(0, n) , donde este último lanzará una excepción ArgumentOutOfRangeException para n > str.Length .

IEnumerable cuenta que la versión de LINQ devuelve un IEnumerable , por lo que tendría que convertir IEnumerable en string : new string(s.Take(n).ToArray()) .

Cada vez que tengo que hacer manipulaciones de cadena en C #, echo de menos las buenas funciones anteriores de Left y Right de Visual Basic, que son mucho más simples de usar que la Substring .

Entonces, en la mayoría de mis proyectos de C #, creo métodos de extensión para ellos:

 public static class StringExtensions { public static string Left(this string str, int length) { return str.Substring(0, Math.Min(length, str.Length)); } public static string Right(this string str, int length) { return str.Substring(str.Length - Math.Min(length, str.Length)); } } 

Nota:
La parte Math.Min está ahí porque Substring arroja una ArgumentOutOfRangeException cuando la longitud de la cadena de entrada es menor que la longitud solicitada, como ya se mencionó en algunos comentarios en respuestas anteriores.

Uso:

 string longString = "Long String"; // returns "Long"; string left1 = longString.Left(4); // returns "Long String"; string left2 = longString.Left(100); 
 public static string TruncateLongString(this string str, int maxLength) { return str.Length <= maxLength ? str : str.Remove(maxLength); } 

Simplemente:

 public static String Truncate(String input,int maxLength) { if(input.Length > maxLength) return input.Substring(0,maxLength); return input; } 

si estamos hablando de validaciones también por qué no hemos verificado las entradas de cadenas nulas. ¿Alguna razón específica?

Creo que a continuación la ayuda, ya que IsNullOrEmpty es un método definido por el sistema y los operadores ternarios tienen una complejidad ciclomática = 1, mientras que if () {} else {} tiene el valor 2.

  public static string Truncate(string input, int truncLength) { return (!String.IsNullOrEmpty(input) && input.Length >= truncLength) ? input.Substring(0, truncLength) : input; } 
 substring(int startpos, int lenght); 

Agregué esto en mi proyecto simplemente porque donde estoy usando es una gran posibilidad de que se use en bucles, en un proyecto alojado en línea, por lo tanto, no quería ningún locking si podía hacerlo. La longitud se ajusta a una columna que tengo. Es C # 7

Solo una línea

  public static string SubStringN(this string Message, int Len = 499) => !String.IsNullOrEmpty(Message) ? (Message.Length >= Len ? Message.Substring(0, Len) : Message) : ""; 

string.Substring (0, n); // 0 – índice de inicio y n – número de caracteres