Truncar cadena en palabras completas en .NET C #

Estoy tratando de truncar un texto largo en C #, pero no quiero que mi cadena se corte a través de una palabra. ¿Alguien tiene una función que pueda usar para truncar mi cadena al final de una palabra?

P.ej:

"This was a long string..." 

No:

 "This was a long st..." 

Intenta lo siguiente. Es bastante rudimentario. Simplemente encuentra el primer espacio a partir de la longitud deseada.

 public static string TruncateAtWord(this string value, int length) { if (value == null || value.Length < length || value.IndexOf(" ", length) == -1) return value; return value.Substring(0, value.IndexOf(" ", length)); } 

Gracias por tu respuesta Dave. He ajustado un poco la función y esto es lo que estoy usando … a menos que haya más comentarios;)

 public static string TruncateAtWord(this string input, int length) { if (input == null || input.Length < length) return input; int iNextSpace = input.LastIndexOf(" ", length, StringComparison.Ordinal); return string.Format("{0}...", input.Substring(0, (iNextSpace > 0) ? iNextSpace : length).Trim()); } 

Mi contribución:

 public static string TruncateAtWord(string text, int maxCharacters, string trailingStringIfTextCut = "…") { if (text == null || (text = text.Trim()).Length <= maxCharacters) return text; int trailLength = trailingStringIfTextCut.StartsWith("&") ? 1 : trailingStringIfTextCut.Length; maxCharacters = maxCharacters - trailLength >= 0 ? maxCharacters - trailLength : 0; int pos = text.LastIndexOf(" ", maxCharacters); if (pos >= 0) return text.Substring(0, pos) + trailingStringIfTextCut; return string.Empty; } 

Esto es lo que uso en mis proyectos, con finalización opcional. El texto nunca excederá la longitud máxima de los caracteres máximos + caracteres finales.

Si está utilizando formularios de Windows, en el método Graphics.DrawString, hay una opción en StringFormat para especificar si la cadena debe truncarse, si no se ajusta al área especificada. Esto manejará agregar los puntos suspensivos según sea necesario.

http://msdn.microsoft.com/en-us/library/system.drawing.stringtrimming.aspx

Esta solución también funciona (toma las primeras 10 palabras de myString):

 String.Join(" ", myString.Split(' ').Take(10)) 

Tomé su enfoque un poco más lejos:

 public string TruncateAtWord(string value, int length) { if (value == null || value.Trim().Length <= length) return value; int index = value.Trim().LastIndexOf(" "); while ((index + 3) > length) index = value.Substring(0, index).Trim().LastIndexOf(" "); if (index > 0) return value.Substring(0, index) + "..."; return value.Substring(0, length - 3) + "..."; } 

Estoy usando esto para truncar tweets.

Opción simplificada, agregada de caracteres troncales y la hizo una extensión.

  public static string TruncateAtWord(this string value, int maxLength) { if (value == null || value.Trim().Length <= maxLength) return value; string ellipse = "..."; char[] truncateChars = new char[] { ' ', ',' }; int index = value.Trim().LastIndexOfAny(truncateChars); while ((index + ellipse.Length) > maxLength) index = value.Substring(0, index).Trim().LastIndexOfAny(truncateChars); if (index > 0) return value.Substring(0, index) + ellipse; return value.Substring(0, maxLength - ellipse.Length) + ellipse; } 

Heres lo que se me ocurrió. Esto es para obtener el rest de la oración también en trozos.

 public static List SplitTheSentenceAtWord(this string originalString, int length) { try { List truncatedStrings = new List(); if (originalString == null || originalString.Trim().Length <= length) { truncatedStrings.Add(originalString); return truncatedStrings; } int index = originalString.Trim().LastIndexOf(" "); while ((index + 3) > length) index = originalString.Substring(0, index).Trim().LastIndexOf(" "); if (index > 0) { string retValue = originalString.Substring(0, index) + "..."; truncatedStrings.Add(retValue); string shortWord2 = originalString; if (retValue.EndsWith("...")) { shortWord2 = retValue.Replace("...", ""); } shortWord2 = originalString.Substring(shortWord2.Length); if (shortWord2.Length > length) //truncate it further { List retValues = SplitTheSentenceAtWord(shortWord2.TrimStart(), length); truncatedStrings.AddRange(retValues); } else { truncatedStrings.Add(shortWord2.TrimStart()); } return truncatedStrings; } var retVal_Last = originalString.Substring(0, length - 3); truncatedStrings.Add(retVal_Last + "..."); if (originalString.Length > length)//truncate it further { string shortWord3 = originalString; if (originalString.EndsWith("...")) { shortWord3 = originalString.Replace("...", ""); } shortWord3 = originalString.Substring(retVal_Last.Length); List retValues = SplitTheSentenceAtWord(shortWord3.TrimStart(), length); truncatedStrings.AddRange(retValues); } else { truncatedStrings.Add(retVal_Last + "..."); } return truncatedStrings; } catch { return new List { originalString }; } } 

yo uso esto

 public string Truncate(string content, int length) { try { return content.Substring(0,content.IndexOf(" ",length)) + "..."; } catch { return content; } }