Entiendo que puedo llamar a ToString(). IndexOf (...), pero no quiero crear una cadena adicional. Entiendo que puedo escribir una rutina de búsqueda de forma manual. Me pregunto por qué tal rutina no existe en el marco.¿Por qué StringBuilder no tiene el método IndexOf?
Respuesta
Desafortunadamente, muchos de los métodos implementados para String podrían haberse implementado para StringBuilder pero eso no se hizo. Considere usar métodos de extensión para agregar lo que le importa.
Llamar a ToString()
en un StringBuilder
no crea un objeto extra, confusamente. Internamente, StringBuilder
almacena un objeto String para el rendimiento; llamando al ToString()
simplemente devuelve ese objeto.
Sé que esta es una pregunta anterior, sin embargo, he escrito un método de extensión que realiza un IndexOf
en un StringBuilder
. Está abajo. Espero que ayude a cualquiera que encuentre esta pregunta, ya sea desde Google buscando o buscando StackOverflow.
/// <summary>
/// Returns the index of the start of the contents in a StringBuilder
/// </summary>
/// <param name="value">The string to find</param>
/// <param name="startIndex">The starting index.</param>
/// <param name="ignoreCase">if set to <c>true</c> it will ignore case</param>
/// <returns></returns>
public static int IndexOf(this StringBuilder sb, string value, int startIndex, bool ignoreCase)
{
int index;
int length = value.Length;
int maxSearchLength = (sb.Length - length) + 1;
if (ignoreCase)
{
for (int i = startIndex; i < maxSearchLength; ++i)
{
if (Char.ToLower(sb[i]) == Char.ToLower(value[0]))
{
index = 1;
while ((index < length) && (Char.ToLower(sb[i + index]) == Char.ToLower(value[index])))
++index;
if (index == length)
return i;
}
}
return -1;
}
for (int i = startIndex; i < maxSearchLength; ++i)
{
if (sb[i] == value[0])
{
index = 1;
while ((index < length) && (sb[i + index] == value[index]))
++index;
if (index == length)
return i;
}
}
return -1;
}
Se dice [Use el método String.ToUpperInvariant en lugar del método String.ToLowerInvariant cuando normaliza cadenas para comparación] (https://docs.microsoft.com/en-us/dotnet/standard/base-types/best-practices -strings # recommendations-for-string-usage). Supongo que esto también es cierto para la comparación de caracteres: [Char.ToUpper y Char.ToLower funcionan de forma similar a los métodos String.ToUpper y String.ToLower descritos en la sección anterior] (https://docs.microsoft.com/es-es/)/dotnet/standard/base-types/best-practices-strings # chartoupper-and-chartolower) – Sergey
Llamada justa; no dude en hacer las ediciones en la publicación anterior. – Dennis
Lo siento, estaba equivocado. En realidad, Microsoft ha optimizado * ToUpperInvariant() *, not * ToUpper() *. En este caso, no podemos proporcionar * ToUpperInvariant() * de forma predeterminada en la medida en que puede dar lugar a una comparación incorrecta en algunos idiomas como el turco. Entonces, en este sentido, tu código es absolutamente correcto. – Sergey
- 1. ¿Por qué el lenguaje Python no tiene un método writeln()?
- 2. ¿Por qué el iterador no tiene ningún método de reinicio?
- 3. ¿Por qué IndexOf devuelve -1?
- 4. ¿Por qué el método String.indexOf no forma parte de la interfaz CharSequence?
- 5. ¿Por qué XElement no tiene un método GetAttributeValue?
- 6. ¿Por qué ObservableCollection no tiene un método RemoveAll?
- 7. ¿Por qué java.io.File no tiene un método close()?
- 8. indexOf no funciona
- 9. ¿Por qué StringBuffer/StringBuilder no anula iguales o hashCode?
- 10. ¿Por qué el tipo de cadena tiene un método .ToString()?
- 11. Elección del algoritmo para el método .indexOf en Java
- 12. El objeto no tiene el método 'reemplazar'
- 13. ¿Por qué C no tiene paquete privado?
- 14. ¿Por qué la clase python datetime tiene un método 'fromtimestamp', pero no un método 'totimestamp'? clase
- 15. HTMLInputElement no tiene el método 'val'
- 16. ¿por qué jvm tiene muchos clasloaders? ¿por qué no uno?
- 17. ¿Cuándo StringBuffer/StringBuilder no es utilizado implícitamente por el compilador?
- 18. ¿Por qué el método Opción o No tiene este argumento implícito superfluo?
- 19. ¿Por qué boost no tiene un make_scoped()?
- 20. ¿Por qué C# HashSets tiene un método Distinct()
- 21. ¿Por qué SerializationInfo no tiene métodos TryGetValue?
- 22. ¿Por qué no hay un método Convert.toFloat()?
- 23. CompositeData no tiene el método keys()?
- 24. HTMLCanvasElement no tiene el método 'toDataUrl'
- 25. ¿Por qué Python no tiene variables estáticas?
- 26. ¿Por qué ActionScript no tiene "genéricos"?
- 27. ¿Por qué el .htaccess no tiene ningún efecto?
- 28. ¿Por qué el BigDecimal de Scala no tiene un CERO?
- 29. ¿Por qué mi xdebug no tiene el estilo?
- 30. por qué el método save_model no funciona en admin.StackedInline?
esto no es correcto en el contexto de la pregunta si se le pide al StringBuilder modificar en sí Tthen se crea una nueva cadena * *, la mutabilidad del búfer interno no está expuesto al código administrado. – ShuggyCoUk
@ ShuggyCoUk: mi comentario fue un poco simplista. Lo he eliminado –
Para aclarar el comentario anterior, no hay mucha sobrecarga al llamar a ToString. Pero después de llamarlo, la próxima modificación de StringBuilder incurrirá en gastos generales de copia. (Esta es una optimización válida porque ToString suele ser lo último que se le hace a StringBuilder). Como resultado de esto, las implementaciones eficientes de métodos tipo String no pueden usar ToString, lo que impide una solución trivial al problema del cartel original. –