Teilen Sie die Zeichenfolge mit LINQ in eine Liste von Zeichenfolgen mit N-Länge auf

Ich weiß, dass das Konzept von String.Split bereits mit einer Vielzahl von Ansätzen angesprochen wurde, aber ich bin speziell an einer LINQ-Lösung für diese Frage interessiert.

Ich habe versucht, eine Erweiterungsklasse zu schreiben, um die Aufteilung zu bewältigen, aber beide Versuche haben einige schwerwiegende Probleme. Also für folgendes:

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

Ich möchte eine Liste wie: {"ABCD", "EFGH", "IJKL", "MNOP", "QRST", "UVWX"}

Hier ist meine Erweiterungsklasse:

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

Versuch 1 fügt einen Dummy-String "|" Jedes Mal, wenn die Bedingung nicht erfüllt ist, werden alle Instanzen der Dummy-Zeichenfolge entfernt, um die endgültige Liste zu erstellen. Es funktioniert, aber das Erstellen der fehlerhaften Zeichenfolgen scheint ein unnötiger zusätzlicher Schritt zu sein. Darüber hinaus schlägt dieser Versuch fehl, wenn die Zeichenfolge nicht gleichmäßig durch n teilbar ist.

In Versuch 2 habe ich versucht, nur Teilzeichenfolgen auszuwählen, bei denen der Index durch N teilbar war, aber der 'i'-Wert in der Select-Anweisung entspricht nicht dem' i'-Wert in der Where-Anweisung. Daher erhalte ich folgende Ergebnisse: {" ABCD "," BCDE ", etc ...}

Ich fühle mich einer guten Lösung nahe, könnte aber einen hilfreichen Anstoß in die richtige Richtung gebrauchen. Irgendwelche Vorschläge?

[Bearbeiten]

Am Ende hatte ich eine Kombination von Vorschlägen für den Umgang mit meinem Saitensplitter. Es ist vielleicht nicht die schnellste, aber als Neuling in LINQ war diese Implementierung für mich die prägnanteste und verständlichste.

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

Danke für all die tollen Vorschläge.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage