lunes, 22 de octubre de 2007

Una carencia del método String.Replace del .NET Framework

El otro día me viene un colega del curro y me comenta: "Miguel, mi aplicación recibe un string cuyo contenido varía, y yo siempre tengo que reemplazar el carácter en la posición 1 (siempre en esa posición), por el carácter 'P'. ¿Cómo hago esto en C#?"

Casi antes de que acabe la pregunta, le corto y le comento super orgulloso de la muerte por mi rapidez de reacción y supuesto control de C#: "¡String.Replace tío!, de toda la vida..."

Me dice que ya lo ha mirado pero que no hay manera. "¿Que no qué...?". Como buen cabezón que soy, abro el Visual Studio y hago la prueba en cuestión:

string s = "ihj";
s = s.Replace(


Según abro el paréntesis y navego por las dos únicas definiciones que tiene String.Replace, mi cara de póker va en aumento. String.Replace permite únicamente reemplazar uno o varios caracteres por uno u otros caracteres, pero no hay manera de reemplazar un carácter en una determinada posición por otro carácter u otros. ¡Pues vaya!

Aunque no me mola demasiado, saco el librillo de "viejo zorro" y le propongo un par de alternativas que funcionan que te pasas. ¡Tachán!

// Alternativa1
s = s.Remove(1, 1).Insert(1, "P");

// Alternativa2
char[] array = s.ToCharArray();
array[1] = 'P';
s = new string(array);

Just in case (y porque la curiosidad me come por dentro), pongo un post en Internet, donde la discusión se anima en seguida, y donde me intentan convencer a toda costa con diferentes razonamientos y alternativas de programación:

// Alternativa3
StringBuilder sb = new StringBuilder("ihj");
sb[1] = 'P';


Muy bien, está bien saber que hay más "viejos zorros" en el mundo de la programación, pero las explicaciones no me convencen en absoluto, y menos las soluciones o workarounds (algunas bastante "chapus"; otras "requete-enrevesadas") que algunos plantean. Por ello, me uno a la causa de mi colega y propongo a MS un feature request con el que añadan una sobrecarga al método String.Replace del .NET Framework. Tan sencillo como esto:

String Replace(int indexToChange, string newCharactersToReplace);

Con lo que hacer s = s.Replace(1, "P") se convertiría en un auténtico y cómodo placer.

SaludoX.


3 comentarios:

Anónimo dijo...

Quizas de tentos feature request que seguramente tiene MS, ha implementadolos metodos de extension en .NET 3.5, con eso se puede solucionar cualquier falta de metodos para una clase :D

¿digo no? jaja
no se omo llegue hasta aqui.. pero ya esta en mis favoritos y en estos dias usare algunas refrencias para mi space..

Saludos!!!

Anónimo dijo...

Buenas Richard, como dices, supongo que los métodos de extensión del .NET Framework 3.5 solucionan en parte esta papeleta, pero tampoco me parece la mejor de las soluciones...no creo que les cueste tanto implementar lo que tú, yo y otra mucha gente hemos echado en falta.

Te parecerá una tontería, pero cada día alucino más con la de visitas que genera este post en concreto de mi blog. Será porque mucha gente tiene el mismo problema con el "replace" de C# o algo relacionado ;-)

Gracias por leerme y saludoX.

Unknown dijo...

String h ={asdkljs};

string t = h.Replace("a","k");

t= {ksdkljs}