Hier einige Code, der das tun, was Sie wollen. Vollständige Erklärung folgt aber in Zusammenfassung nimmt es sich die Tatsache zunutze, dass, sobald Sie alle Buchstaben einer bestimmten Länge getan haben Sie durch diese gesamte Sequenz A folgte sie dann wieder durch die gesamte Sequenz erneut gefolgt B usw.
private IEnumerable<string> EnumerateLetters()
{
int count = 1;
while (true)
{
foreach(var letters in EnumerateLetters(count))
{
yield return letters;
}
count++;
}
}
private IEnumerable<string> EnumerateLetters(int count)
{
if (count==0)
{
yield return String.Empty;
}
else
{
char letter = 'A';
while(letter<='Z')
{
foreach(var letters in EnumerateLetters(count-1))
{
yield return letter+letters;
}
letter++;
}
}
}
Es gibt zwei Methoden. Der erste ist der, den Sie anrufen und wird eine unendliche Folge von Buchstaben erzeugen. Die zweite macht die Rekursionsmagie.
Die erste ist ziemlich einfach. es zählt, wie viele Buchstaben wir haben, ruft die zweite Methode mit dieser Zählung auf und zählt sie dann auf, indem er sie zurückgibt. Sobald es alles für eine Größe getan hat, erhöht es die Anzahl und Schleifen.
Die zweite Methode ist die, die die Magie macht. Es zählt die Anzahl der Buchstaben in der generierten Zeichenfolge. Wenn der Zählerstand null ist, wird eine leere Zeichenfolge zurückgegeben, und es wird abgebrochen.
Wenn die Anzahl mehr als eins ist, wird es durch die Buchstaben A bis Z durchlaufen und für jeden Buchstaben wird die Sequenz angehängt, die um eins kürzer ist als an die A. Dann für die B und so weiter.
Dies wird dann unbegrenzt weitergehen.
Die Sequenz wird unbegrenzt weitergezählt. Da die Rekursion verwendet wird, wäre es theoretisch möglich, den Stapelüberlauf zu starten, wenn die Buchstabenfolge zu lang wird, aber auf einer Rekursionsebene pro Buchstabe in der Zeichenfolge müssen Sie sehr lange Strings aufstellen, bevor Sie sich darum kümmern müssen (und ich vermute, wenn du so weit in eine Schleife gegangen bist, dass du zuerst andere Probleme hast).Der andere wichtige Punkt (wenn Sie sich dessen nicht bewusst sind) ist, dass yield return eine verzögerte Ausführung verwendet, so dass jedes neue Element in der Sequenz wie benötigt generiert wird, sodass es nur so viele Elemente generiert, wie Sie verlangen. Wenn Sie fünf Mal iterieren, wird nur A-E generiert und Sie haben keine Zeit damit verschwendet, darüber nachzudenken, was als nächstes kommt.
Leider bedeutet das, ich muss wissen, wie viele verschachtelte For-Schleifen ich benötigen würde. Es könnte 100 Schleifen sein, was viel zu viel ist, um wirklich zu nisten. –
@Dave Gorden Kennen Sie die Anzahl der Loops, die Sie möchten, bevor es beginnt? –
Nein, die Anzahl der Iterationen ist unbekannt. –