我正在构建一个包含2个字母字符串的所有排列的字符串列表,例如“aa”到“zz”。这就是我所拥有的:
public List<string> SomeMethod(int NumberOfChars) {
for (var i = 0; i < 26; i++)
{
char character1 = (char)(i + 97);
var Letter1 = character1.ToString();
for (var j = 0; j < 26; j++)
{
char character2 = (char)(j + 97);
var Letter2 = character2.ToString();
string TheString = Letter1 + Letter2;
TheList.Add(TheString);
}
}
return TheList;
}
基本上,它是一个循环内部的循环,它结合了字母表中的字符。现在假设我想包含NumberOfChars
作为确定每个字符串长度的参数。例如,如果我传入2,它将返回从"aa"
到"zz"
的所有676个双字母字符串,如果我传入3,它将从"aaa"
返回所有17,576个3个字母的字符串到"zzz"
。
目前,最简单的方法是使用两种不同的方法,一种返回带有两个嵌套循环的双字母字符串,另一种返回带有3个嵌套循环的3字母字符串。
这样做更干净的方法是什么?
感谢。
答案 0 :(得分:15)
这样的方法怎么样:
public IEnumerable<string> SomeMethod(int NumberOfChars)
{
if (NumberOfChars == 0)
{
yield return string.Empty;
}
else
{
for (var i = 'a'; i <= 'z'; i++)
{
foreach (var s in SomeMethod(NumberOfChars - 1))
{
yield return i + s;
}
}
}
}
只是为了好玩,这是使用Linq的另一个解决方案:
public IEnumerable<string> SomeMethod(int n)
{
var r = Enumerable.Range('a', 26).Select(x => ((char)x).ToString());
return (n > 1) ? r.SelectMany(x => SomeMethod(n - 1), (x, y) => x + y) : r;
}
答案 1 :(得分:2)
这是一个使用循环而不是递归的替代方法:
public static List<string> SomeMethod(int numberOfChars)
{
IEnumerable<string> results = new List<string> { "" };
for (int i = 0; i < numberOfChars; ++i)
results = from s in results
from c in Enumerable.Range('a', 26)
select s + (char)c;
return results.ToList();
}