La mejor manera de invertir una cadena

Resuelto Guy asked hace 16 años • 53 respuestas

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í?

Guy avatar Oct 23 '08 07:10 Guy
Aceptado
public static string Reverse( string s )
{
    char[] charArray = s.ToCharArray();
    Array.Reverse(charArray);
    return new string(charArray);
}
PeteT avatar Oct 23 '2008 00:10 PeteT

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.

R. Martinho Fernandes avatar Feb 27 '2013 12:02 R. Martinho Fernandes