static List<string> MakeStrings2(List<string> characters, int finalStringLength)
{
int finalLength = finalStringLength; // The length of the final strings.
List<string> existingStrings;
List<string> newStrings =
new List<string>(); // Start with the all one-letter combinations.
newStrings.AddRange(characters);
for (int len = 2; len <= finalLength; len++)
{
// Start a new collection of strings based on the existing strings.
existingStrings = newStrings;
newStrings = new List<string>();
// Concatenate every string of length (len-1)...
foreach (string str in existingStrings)
{
// ...with every character...
foreach (string ch in characters)
{
// ...to create every possible string of length len.
newStrings.Add(str + ch);
}
}
}
return newStrings;
}
static List<List<string>> MakeStrings2(List<string> characters, int finalStringLength)
{
int finalLength = finalStringLength; // The length of the final strings.
List<List<string>> existingStrings;
List<List<string>> newStrings = new List<List<string>>(); // Start with the all one-letter combinations.
for (int i = 0; i < characters.Count; i++)
{
List<string> alist = new List<string>();
alist.Add(characters[i]);
newStrings.Add(alist);
}
for (int len = 2; len <= finalLength; len++)
{
// Start a new collection of strings based on the existing strings.
existingStrings = newStrings.ToList();
newStrings = new List<List<string>>();
foreach (List<string> str in existingStrings)
{
// ...with every character...
foreach (string ch in characters)
{
// ...to create every possible string of length len.
List<string> str2 = new List<string>();
str2.AddRange(str);
if (!str2.Contains(ch))
{
str2.Add(ch);
}
newStrings.Add(str2);
}
}
}
return newStrings.FindAll(d=>d.Count == finalStringLength);
}