Cadena no tiene ReplaceAt()
, y estoy dando vueltas sobre cómo hacer una función decente que hace lo que necesito. Supongo que el costo de CPU es alta, pero los tamaños de cuerda son pequeñas, así que es todo muy bien¿Reemplazar un char en un índice dado en una cadena?
Respuesta
Utilice un StringBuilder
:
StringBuilder sb = new StringBuilder(theString);
sb[index] = newChar;
theString = sb.ToString();
ah, Stringbuilder es limpio – Jason94
@ Jason94, no estoy seguro de que esto sea más eficiente que usar ToCharArray como en la respuesta de Jon, debe ejecutar pruebas para ver cuál es más rápido. –
Probé con un pequeño punto de referencia en 100k iteraciones, ToCharArray es al menos 2 veces más rápido. –
string s = "ihj";
char[] array = s.ToCharArray();
array[1] = 'p';
s = new string(array);
Los comentarios en la respuesta aceptada indican que este enfoque es dos veces más rápido. – Dejan
El enfoque más simple sería algo así como:
public static string ReplaceAt(this string input, int index, char newChar)
{
if (input == null)
{
throw new ArgumentNullException("input");
}
char[] chars = input.ToCharArray();
chars[index] = newChar;
return new string(chars);
}
Esto es ahora un método de extensión por lo que puede utilizar:
var foo = "hello".ReplaceAt(2, 'x');
Console.WriteLine(foo); // hexlo
sería bueno pensar en alguna manera que sólo se requiere una única copia de los datos para hacer en lugar de los dos aquí, pero no estoy seguro de ninguna manera de hacerlo. Es posible que esto lo haría:
public static string ReplaceAt(this string input, int index, char newChar)
{
if (input == null)
{
throw new ArgumentNullException("input");
}
StringBuilder builder = new StringBuilder(input);
builder[index] = newChar;
return builder.ToString();
}
... Sospecho que depende por completo de la versión del marco que está utilizando.
+1 para convertirlo en un método de extensión. Como se menciona en el comentario de la respuesta aceptada y también en otras respuestas, el método ToCharArray() es más rápido que el método StringBuilder. Una mejora más posible: compruebe si ingresó.Count> index-1 && index> = 0 de lo contrario obtendrá una excepción cuando haga chars [index] o builder [index]. –
cadenas son objetos inmutables, por lo que no puede reemplazar un carácter determinado en la cadena. Lo que puedes hacer es crear una nueva cadena con el personaje dado reemplazado.
Pero si va a crear una nueva cadena, por qué no utilizar un StringBuilder:
string s = "abc";
StringBuilder sb = new StringBuilder(s);
sb[1] = 'x';
string newS = sb.ToString();
//newS = "axc";
public string ReplaceChar(string sourceString, char newChar, int charIndex)
{
try
{
// if the sourceString exists
if (!String.IsNullOrEmpty(sourceString))
{
// verify the lenght is in range
if (charIndex < sourceString.Length)
{
// Get the oldChar
char oldChar = sourceString[charIndex];
// Replace out the char ***WARNING - THIS CODE IS WRONG - it replaces ALL occurrences of oldChar in string!!!***
sourceString.Replace(oldChar, newChar);
}
}
}
catch (Exception error)
{
// for debugging only
string err = error.ToString();
}
// return value
return sourceString;
}
sourceString.Replace (oldChar, newChar) reemplaza todas las ocurrencias de oldChar en la cadena, no solo el carácter en charIndex. – EventHorizon
cadena err = error.ToString(); ¿por qué? –
repente que tenía que hacer esta tarea y encontré este tema. lo tanto, este es mi variante de estilo de LINQ:
public static class Extensions
{
public static string ReplaceAt(this string value, int index, char newchar)
{
if (value.Length <= index)
return value;
else
return string.Concat(value.Select((c, i) => i == index ? newchar : c));
}
}
y luego, por ejemplo:
string instr = "Replace$dollar";
string outstr = instr.ReplaceAt(7, ' ');
Al final que necesitaba para utilizar Net Framework 2, por lo que utilizar una variante de clase StringBuilder
aunque.
¿No sería esto lento para una cadena larga? ¿Por qué hacer esto, en lugar de las soluciones 'StringBuilder' o' ToCharArray'? Es * podría * ser una copia menos de la cadena (en comparación con 'StringBuilder'), pero sospecho que muchas cosas suceden internamente. – ToolmakerSteve
Si su proyecto (.csproj) permite código no seguro, probablemente, esta es la solución más rápida:
namespace System
{
public static class StringExt
{
public static unsafe void ReplaceAt(this string source, int index, char value)
{
if (source == null)
throw new ArgumentNullException("source");
if (index < 0 || index >= source.Length)
throw new IndexOutOfRangeException("invalid index value");
fixed (char* ptr = source)
{
ptr[index] = value;
}
}
}
}
Usted puede usarlo como método de extensión de cadena objetos.
Por supuesto, esto viola la semántica de 'string' - afecta a cualquier otra referencia a este objeto, anulando/contradiciendo la documentación de que los objetos' string' son * inmutables *. Hacerlo así, a una clase incorporada, es muy dudoso (olor a código fuerte). Necesita un comentario WARNING gigante abofeteado. Personalmente, yo ** no ** haría esto. Si alguien necesita una cadena * mutable *, entonces crea una clase apropiada, subclassing o envolviendo un 'char []'. – ToolmakerSteve
- 1. Insertar una cadena en una cadena dado un índice
- 2. Encuentra el índice de un char en una cadena?
- 3. Reemplazar un char en NSString
- 4. Cómo reemplazar un objeto en un NSMutableArray en un índice dado con un nuevo objeto
- 5. En Java, ¿cómo se convierte una Cadena en un char o un char en una Cadena?
- 6. Reemplazar un carácter en un índice determinado en NSString
- 7. ¿Cómo reemplazar un artículo dado en una lista?
- 8. ¿Cómo convierto una cadena en un char * en C++?
- 9. ¿Cómo obtener char de cadena por índice?
- 10. ¿Eliminar elementos secundarios dado un índice?
- 11. Reemplazar números de char después de un char específico
- 12. copiando una subcadena de una cadena dado índice final en la cadena
- 13. ¿Cuántos bytes toma una cadena? ¿Un char?
- 14. ¿Cómo puedo obtener un personaje en un índice dado en Perl?
- 15. C++: inserte char en una cadena
- 16. ¿Cómo reemplazar un apóstrofo en una cadena en Javascript?
- 17. ¿Cómo reemplazar una cadena en un archivo existente en Perl?
- 18. Reemplazar toda la aparición de una cadena en un elemento
- 19. Cómo convertir un puntero char * en una cadena C++?
- 20. Cómo reemplazar caracteres en una cadena java?
- 21. buscar y reemplazar cadena en un archivo
- 22. Delphi - encuentra el personaje en una posición/índice dado
- 23. ¿Cómo puedo copiar parte de otra cadena en C, dado un índice inicial y final
- 24. La forma más rápida de obtener un carácter dentro de una cadena dado el índice (PHP)
- 25. Prólogo: reemplazar un elemento en una lista en un índice especificado
- 26. Reemplazar un carácter de una cadena en python
- 27. reemplazar una cadena dentro de un rango en C#
- 28. cómo reemplazar un marcador de posición en una cadena?
- 29. ¿Cómo reemplazar un carácter de una cadena en SQL?
- 30. Reemplazar un carácter con una cadena en LaTeX
¿No quiso decir 'does not have' en lugar de 'does have'? :) – Abbas