#retosMSDN: Solución al Reto 8 – Orden lexicográfico en C#


El pasado viernes Leo Antoli (@lantoli) nos propuso el octavo de los #retosMSDN: Reto 8 – Orden lexicográfico en C#. Muchas gracias Leo por proponer este reto tan interesante, y muchas gracias una vez más a todos los que habéis participado en el reto.

 

La solución de Leo

Leo nos propone una solución con un código muy legible y compacto en el que ordena las cadenas con LINQ y expresiones lambda, pero donde la clave está en el uso de un comparador para ordenar las cadenas: “b ba” se puede juntar como “bba” o “bab”, ¿pero cuál iría antes en un diccionario? Sería “bab”, y eso es lo que nos determina el comparador.

 

public class AlphabeticalOrder
{
    private static IComparer<string> comparer = Comparer<string>.Create(
        (a, b) => (a + b).CompareTo(b + a));
 
    public static IEnumerable<string> GetShortestConcatString(params string[] input)
    {
        return GetShortestConcatString(input as IEnumerable<string>);
    }
 
    public static IEnumerable<string> GetShortestConcatString(IEnumerable<string> input)
    {
 
        if (input == null || input.Any(x => x == null))
        {
            throw new ArgumentNullException("input", "must not be null or contains null elements");
        }
 
        return input.Select(GetShortestConcatString);
    }
 
    public static string GetShortestConcatString(string input)
    {
        if (input == null)
        {
            throw new ArgumentNullException("input");
        }
 
        return string.Join("", input.Split().OrderBy(x => x, comparer));
    }
}

 

El código completo lo puedes encontrar en esta solución de Visual Studio 2013 que puedes descargarte de GitHub.

 

Como comentamos a principios de esta semana te queremos proponer varios retos para que te entretengas durante las Navidades. Por eso aumentamos la frecuencia durante estas fiestas y además del reto que publicaremos hoy publicaremos otro el 26 de diciembre y otro el 2 de enero. ¡Esperamos que los disfrutes!

Y si quieres retar al resto de la comunidad con tu propio reto, recuerda que puedes enviárnoslo a esmsdn@microsoft.com.

Un saludo,

Alejandro Campos Magencio (@alejacma)

Technical Evangelist

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

Comments (0)

Skip to main content