#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.