我期待的代码,它可以产生一个阵列,其中第一项是一个,然后乙,然后Ç..在Z之后,它将转到AA,然后是AB然后是AC...一直到ZZ.
在C#中执行此操作的最佳方法是什么?
Vla*_*lad 21
其中一种方法是:
IEnumerable<string> generate()
{
for (char c = 'A'; c <= 'Z'; c++)
yield return new string(c, 1);
for (char c = 'A'; c <= 'Z'; c++)
for (char d = 'A'; d <= 'Z'; d++)
yield return new string(new[] { c, d });
}
Run Code Online (Sandbox Code Playgroud)
编辑:
您实际上可以long使用更复杂的代码生成"无限"序列(以最大值为界):
string toBase26(long i)
{
if (i == 0) return ""; i--;
return toBase26(i / 26) + (char)('A' + i % 26);
}
IEnumerable<string> generate()
{
long n = 0;
while (true) yield return toBase26(++n);
}
Run Code Online (Sandbox Code Playgroud)
这个是这样的:A,B,......,Z,AA,AB,...,ZZ,AAA,AAB,......等:
foreach (var s in generate().Take(200)) Console.WriteLine(s);
Run Code Online (Sandbox Code Playgroud)
弗拉德的好答案。
这是另一个变化:
static IEnumerable<string> generate() {
for (char c = 'A'; c <= 'Z'; c++) {
yield return c.ToString();
}
foreach (string s in generate()) {
for (char c = 'A'; c <= 'Z'; c++) {
yield return s + c;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您不介意以空字符串开始序列,您可以按如下方式编写:
static IEnumerable<string> generate() {
yield return "";
foreach (string s in generate()) {
for (char c = 'A'; c <= 'Z'; c++) {
yield return s + c;
}
}
}
Run Code Online (Sandbox Code Playgroud)