Разбить строку на список строк N-длины с помощью LINQ

Я знаю, что концепция String.Split была рассмотрена ранее с помощью множества различных подходов, но я особенно заинтересован в LINQ-решении этого вопроса.

Я попытался написать класс расширения для обработки разбиения, но обе попытки имеют некоторые серьезные проблемы. Так что для следующего:

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

Я хотел бы список, как: {"ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX"}

Вот мой класс расширения:

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;
    }
}

Попытка 1 вставляет фиктивную строку "|" каждый раз, когда условие не выполняется, затем удаляются все экземпляры фиктивной строки для создания окончательного списка. Это работает, но создание плохих строк кажется ненужным дополнительным шагом. Кроме того, эта попытка не удалась, если строка не делится поровну на n.

Попытка 2 состояла в том, что я пытался выбрать только те подстроки, где индекс делился на N, но значение 'i' в выражении Select не соответствует значению 'i' в выражении Where, поэтому я получаю результаты вроде: {" ABCD "," BCDE "и т. Д ...}

Я чувствую, что близок к хорошему решению, но могу использовать полезное толчок в правильном направлении. Какие-либо предложения?

[Редактировать]

Я закончил тем, что пошел с комбинацией предложений, чтобы обращаться с моим разделителем строки. Возможно, он не самый быстрый, но, как новичок в LINQ, эта реализация была для меня самой краткой и простой для понимания.

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();
}

Спасибо за все отличные предложения.

Ответы на вопрос(8)

Ваш ответ на вопрос