Parti con una collezione di parole che contiene una sola collezione vuota.
Per ogni lettera nell'alfabeto aggiungi la lettera a ogni parola nella collezione e raccogli i risultati.
Per ottenere le parole di lunghezza n ripeti n volte lo step precedente usando come lista di parole quella generata dalla precedente esecuzione.
Se nel mentre collezioni i risultati dei vari step ottieni la lista di parole [1-n].
Con collezioni immutabili e linq sono una decina di righe:
codice:
using System;using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
namespace Example
{
class Program
{
static void Main(string[] args)
{
foreach(string w in upToN("ab", 3)) {
Console.WriteLine(w);
}
Console.ReadKey();
}
private static IEnumerable<ImmutableList<char>> step(string alphabet, IEnumerable<ImmutableList<char>> prev)
{
return
from c in alphabet
from w in prev
select w.Add(c);
}
private static IEnumerable<string> upToN(string alphabet, int n)
{
List<string> words = new List<string>();
IEnumerable<ImmutableList<char>> prev = new List<ImmutableList<char>>(){ ImmutableList<char>.Empty };
for(int i = 0; i < n; ++i)
{
prev = step(alphabet, prev);
words.AddRange(
from w in prev
select String.Concat(w)
);
}
return words;
}
}
}