Browsing posts in: Code Katas

UpperCounter Kata con LINQ, primera parte

Hace unos días Roberto Luis publicaba una kata con la que habían estado trabajando en Software Craftmanship Madrid, y me animaba a resolverla. Y no iba yo a negarle tal sugerencia a Roberto, así que aquí está mi intento con LINQ; el vídeo lo dejamos para otra ocasión.

Toda la solución se basa en una sobrecarga del método de extensión Select, que a poca gente he visto usar y que nos permite proyectar, además del elemento sobre el que se está trabajando, el índice del mismo en una lista…¿qué más se puede pedir?

Pues eso, unido a un selector que nos provea sólo los elementos que son mayúscula y ¡magia! Y tanto que magia, porque a ver quién debuggea esto luego si se complica el asunto en un caso de la vida real donde se sustituye un foreach por LINQ. Quedará mucho más h4x0r en código, pero a veces no es necesario, querido R#. En todo caso quería intentarlo, y queda así:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace UppercaseSearcher
{
    class UppercaseSearcher
    {
       public static List<int> Search(string input)
        {
            return input.Select((ch, index) => new { index, ch }).Where(x => char.IsUpper(x.ch)).Select(t => t.index).ToList();
        }
    }
}

Paso a paso se ve más sencillo: lo primero que asumimos es tratar la string como un array de chars, de ahí, el primer Select proyecta cada uno de los elementos a un tipo anónimo que no es más que una tupla int,char; seleccionamos sólo los elementos que satisfagan la condición del kata, y aplanamos dicho objeto anónimo para que sólo nos devuelva los índices que los que pasaron la condición.

Sobre los tests, aunque fueron iguales a los de Roberto, y una segunda parte con restricciones hablaremos más adelante, si la solución que se me ocurre no es tan parecida a la de él :).