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

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

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

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

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

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

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

        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 вставляет фиктивную строку "|" каждый раз, когда условие неt met, затем удаляет все экземпляры фиктивной строки для создания окончательного списка. Это работает, но создание плохих строк кажется ненужным дополнительным шагом. Кроме того, эта попытка не удалась, если строка неделится поровну.

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

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

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

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

public static List 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)

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