¿Reemplazando un char en un índice dado en una cadena?

String no tiene ReplaceAt() , y estoy ReplaceAt() sobre cómo hacer una función decente que haga lo que necesito. Supongo que el costo de la CPU es alto, pero los tamaños de cadena son pequeños, así que todo está bien

Use un StringBuilder :

 StringBuilder sb = new StringBuilder(theString); sb[index] = newChar; theString = sb.ToString(); 

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); } 

Este es ahora un método de extensión para que pueda usar:

 var foo = "hello".ReplaceAt(2, 'x'); Console.WriteLine(foo); // hexlo 

Sería bueno pensar en alguna forma que solo requiera una copia única de los datos en lugar de los dos aquí, pero no estoy seguro de ninguna forma de hacerlo. Es posible que esto lo haga:

 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 completamente de la versión del marco que estés usando.

 string s = "ihj"; char[] array = s.ToCharArray(); array[1] = 'p'; s = new string(array); 

De repente, tuve que hacer esta tarea y encontré este tema. Entonces, esta es mi variante estilo 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 necesité utilizar .Net Framework 2, así que utilizo una variante de clase StringBuilder .

Las cadenas son objetos inmutables, por lo que no puede reemplazar un carácter dado 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 usar un StringBuilder?

 string s = "abc"; StringBuilder sb = new StringBuilder(s); sb[1] = 'x'; string newS = sb.ToString(); //newS = "axc"; 

Si su proyecto (.csproj) permite un código inseguro, 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; } } } } 

Puede usarlo como método de extensión de objetos String .

 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; }