Dividir cadena en lista de cadenas de longitud N usando LINQ

Sé que el concepto de String.Split se ha abordado anteriormente con una multitud de enfoques diferentes, pero estoy específicamente interesado en una solución LINQ para esta pregunta.

Intenté escribir una clase de extensión para manejar la división, pero ambos intentos tienen algunos problemas importantes. Así que para lo siguiente:

string s = "ABCDEFGHIJKLMNOPQRSTUVWX";
var results = s.SplitEvery(4);

Me gustaría una lista como: {"ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX"}

Aquí está mi clase de extensión:

public static class Extensions
{
    public static List<string> SplitEvery(this string s, int n)
    {
        List<string> list = new List<string>();

        var Attempt1 = s.Select((c, i) => i % n== 0 ? s.Substring(i, n) : "|").Where(x => x != "|").ToList();

        var Attempt2 = s.Where((c, i) => i % n== 0).Select((c, i) => s.Substring(i, n)).ToList();

        return list;
    }
}

Intento 1 inserta una cadena ficticia "|" Cada vez que no se cumple la condición, se eliminan todas las instancias de la cadena ficticia para crear la lista final. Funciona, pero crear las cadenas malas parece un paso adicional innecesario. Además, este intento falla si la cadena no es divisible de manera uniforme por n.

El intento 2 fue cuando intenté seleccionar solo subcadenas donde el índice era divisible por N, pero el valor 'i' en la instrucción Select no corresponde al valor 'i' en la declaración Where, así que obtengo resultados como: {" ABCD "," BCDE ", etc ...}

Siento que estoy cerca de una buena solución, pero podría usar un empujón útil en la dirección correcta. ¿Alguna sugerencia?

[Editar]

Terminé yendo con una combinación de sugerencias para manejar mi separador de cuerdas. Puede que no sea el más rápido, pero como novato de LINQ, esta implementación fue la más breve y fácil de entender.

public static List<string> SplitEvery(this string s, int size)
{
    return s.Select((x, i) => i)
        .Where(i => i % size == 0)
        .Select(i => String.Concat(s.Skip(i).Take(size))).ToList();
}

Gracias por todas las excelentes sugerencias.

Respuestas a la pregunta(8)

Su respuesta a la pregunta