La mejor manera de invertir una cadena
Tuve que escribir una función inversa de cadena en C# 2.0 (es decir, LINQ no disponible) y se me ocurrió esto:
public string Reverse(string text)
{
char[] cArray = text.ToCharArray();
string reverse = String.Empty;
for (int i = cArray.Length - 1; i > -1; i--)
{
reverse += cArray[i];
}
return reverse;
}
Personalmente no estoy loco por la función y estoy convencido de que hay una mejor manera de hacerlo. ¿Está ahí?
public static string Reverse( string s )
{
char[] charArray = s.ToCharArray();
Array.Reverse(charArray);
return new string(charArray);
}
Aquí hay una solución que invierte correctamente la cadena "Les Mise\u0301rables"
como "selbare\u0301siM seL"
. Esto debería mostrarse como selbarésiM seL
, no selbaŕesiM seL
(tenga en cuenta la posición del acento), como lo haría la mayoría de las implementaciones basadas en unidades de código ( Array.Reverse
, etc.) o incluso puntos de código (invirtiendo con especial cuidado para los pares sustitutos).
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
public static class Test
{
private static IEnumerable<string> GraphemeClusters(this string s) {
var enumerator = StringInfo.GetTextElementEnumerator(s);
while(enumerator.MoveNext()) {
yield return (string)enumerator.Current;
}
}
private static string ReverseGraphemeClusters(this string s) {
return string.Join("", s.GraphemeClusters().Reverse().ToArray());
}
public static void Main()
{
var s = "Les Mise\u0301rables";
var r = s.ReverseGraphemeClusters();
Console.WriteLine(r);
}
}
(Y un ejemplo de ejecución en vivo aquí: https://ideone.com/DqAeMJ )
Simplemente utiliza la API .NET para la iteración del clúster de grafemas , que ha estado allí desde siempre, pero al parecer está un poco "oculta" a la vista.