Thursday, April 16, 2009

Unir cadenas con comas

Hace unos dias Eric publico un problema, al principio me dio flojera responderlo, pero al ver el numero de respuestas decidi hacerlo agregando el reto personal de ser la respuesta mas corta (con mi equipo anterior competiamos en ver quien podia refactorizar mas), asi que aqui esta:
El problema:
Escribir una funcion que tome un IEnumerable no nulo y regrese una cadena con las siguentes caracteristicas:

(1) Si la secuencia esta vacia, regresar "{}".
(2) Si la secuencia contiene un solo elemento "ABC" el resultado sera "{ABC}".
(3) Si la secuencia contiene 2 elementos "ABC", "DEF" El resultado sera "{ABC and DEF}".
(4) Si la secuencia contiene mas de 2 elementos "ABC", "DEF", "G", "H" el resultado sera "{ABC, DEF, G and H}". (Noten que los ultimos 2 elementos no estan unidos por coma)

Mi solucion:

static string JoinStrings(IEnumerable<string> strings) {

    int len = strings.Count();

    return "{"+(

        (len > 1) ?

            strings.Take(len - 1)

            .Aggregate((string head, string tail) => head+", "+tail)+

            " and " +strings.Last()

        : (len == 1) ?

            strings.First()

        : "")+

        "}";

}

Por cierto, si solo quisieramos unir las cadenas con comas (y regresar una cadena vacia cuando no hay elementos), pudieramos utilizar esto:

static string JoinStrings2(IEnumerable<string> strings) {

    return strings.Count() > 0 ?

        strings.Aggregate((string h, string t) => h+", "+t)

        :

        "";

}

No comments: