Podziel ciąg na listę łańcuchów o długości N za pomocą LINQ

Wiem, że koncepcja String.Split została omówiona wcześniej z wieloma różnymi podejściami, ale szczególnie interesuje mnie rozwiązanie LINQ tego pytania.

Próbowałem napisać klasę rozszerzenia do obsługi podziału, ale obie próby mają kilka poważnych problemów. Tak więc dla następujących:

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

Chciałbym listę taką jak: „„ ABCD ”,„ EFGH ”,„ IJKL ”,„ MNOP ”,„ QRST ”,„ UVWX ”}

Oto moja klasa rozszerzenia:

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

Próba 1 wstawia atrapę „|” za każdym razem, gdy warunek nie jest spełniony, usuwa wszystkie wystąpienia atrapy łańcucha, aby utworzyć końcową listę. Działa, ale tworzenie złych ciągów wydaje się niepotrzebnym dodatkowym krokiem. Co więcej, próba ta nie powiedzie się, jeśli łańcuch nie jest równomiernie podzielny przez n.

Próba 2 polegała na próbie wybrania tylko podciągów, w których indeks był podzielny przez N, ale wartość „i” w instrukcji Select nie odpowiada wartości „i” w instrukcji Where, więc otrzymuję wyniki takie jak: {” ABCD ”,„ BCDE ”itd.}}

Czuję, że jestem blisko dobrego rozwiązania, ale mogę użyć pomocnego szturchnięcia we właściwym kierunku. Jakieś sugestie?

[Edytować]

Skończyło się na kombinacji sugestii, aby poradzić sobie z rozdzielaczem strun. Może nie jest to najszybszy, ale jako początkujący w LINQ, ta implementacja była dla mnie najbardziej zwięzła i łatwa do zrozumienia.

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

Dziękujemy za wszystkie doskonałe sugestie.

questionAnswers(8)

yourAnswerToTheQuestion