¿Cómo reemplazar parte de la cuerda por posición?

Resuelto Gali asked hace 13 años • 22 respuestas

Tengo esta cadena:ABCDEFGHIJ

Necesito reemplazar de la posición 4 a la posición 5 con la cuerdaZX

Se verá así:ABCZXFGHIJ

Pero no para usar con string.replace("DE","ZX")- necesito usar con posición

¿Cómo puedo hacerlo?

Gali avatar Feb 16 '11 18:02 Gali
Aceptado
string s = "ABCDEFGH";
s= s.Remove(3, 2).Insert(3, "ZX");
V4Vendetta avatar Feb 16 '2011 11:02 V4Vendetta

La forma más sencilla de agregar y eliminar rangos en una cadena es utilizar el archivo StringBuilder.

var theString = "ABCDEFGHIJ";
var aStringBuilder = new StringBuilder(theString);
aStringBuilder.Remove(3, 2);
aStringBuilder.Insert(3, "ZX");
theString = aStringBuilder.ToString();

Una alternativa es usar String.Substring, pero creo que el StringBuildercódigo se vuelve más legible.

Albin Sunnanbo avatar Feb 16 '2011 11:02 Albin Sunnanbo

Reemplazar en (índice int, longitud int, reemplazo de cadena)

Aquí hay un método de extensión que no usa StringBuilder o Substring. Este método también permite que la cadena de reemplazo se extienda más allá de la longitud de la cadena de origen.

//// str - the source string
//// index- the start location to replace at (0-based)
//// length - the number of characters to be removed before inserting
//// replace - the string that is replacing characters
public static string ReplaceAt(this string str, int index, int length, string replace)
{
    return str.Remove(index, Math.Min(length, str.Length - index))
            .Insert(index, replace);
}

Al utilizar esta función, si desea que toda la cadena de reemplazo reemplace tantos caracteres como sea posible, establezca la longitud en la longitud de la cadena de reemplazo:

"0123456789".ReplaceAt(7, 5, "Hello") = "0123456Hello"

De lo contrario, puede especificar la cantidad de caracteres que se eliminarán:

"0123456789".ReplaceAt(2, 2, "Hello") = "01Hello456789"

Si especifica que la longitud sea 0, entonces esta función actúa igual que la función de inserción:

"0123456789".ReplaceAt(4, 0, "Hello") = "0123Hello456789"

Supongo que esto es más eficiente ya que no es necesario inicializar la clase StringBuilder y utiliza operaciones más básicas. Por favor, corríjame si estoy equivocado. :)

Nicholas Miller avatar Mar 19 '2014 20:03 Nicholas Miller

Si le importa el rendimiento, lo que debe evitar aquí son las asignaciones. Y si estás en .Net Core 2.1+, entonces puedes hacerlo usando el string.Createmétodo :

public static string ReplaceAt(this string str, int index, int length, string replace)
{
    return string.Create(str.Length - length + replace.Length, (str, index, length, replace),
        (span, state) =>
        {
            state.str.AsSpan().Slice(0, state.index).CopyTo(span);
            state.replace.AsSpan().CopyTo(span.Slice(state.index));
            state.str.AsSpan().Slice(state.index + state.length).CopyTo(span.Slice(state.index + state.replace.Length));
        });
}

Este enfoque es más difícil de entender que las alternativas, pero es el único que asignará sólo un objeto por llamada: la cadena recién creada.

svick avatar Jan 05 '2019 20:01 svick