C#用数字和字符创建字符串序列

Sil*_*e47 2 c# string

我试图创建一个数字序列string的格式,一旦我达到"99999"我想用继续序列领先字母

例子:

"00000" -> "00100" -> "99999" -> "A0001" -> "A9999" -> "B0001" -> "ZZZZZ"
Run Code Online (Sandbox Code Playgroud)

有没有简单的方法来实现这一目标?

到目前为止,我尝试string的数字和字母分开,然后如果数字达到最大值,我会进行一些代码检查,如果达到可用的最大值,我会添加一个字母。对我来说看起来并不优雅。

Dmi*_*nko 5

让我们实现GetNextValue方法:对于给定的 value(例如"A9999"),我们计算下一个"B0001"):

private static string GetNextValue(string value) {
  StringBuilder sb = new StringBuilder(value);

  // Digits only: 1239 -> 1240
  for (int i = value.Length - 1; i >= 0; --i) {
    if (sb[i] < '9') {
      sb[i] = (char)(sb[i] + 1);

      return sb.ToString();
    }
    else if (sb[i] >= 'A')
      break;
    else
      sb[i] = '0';
  }

  // 1st letter: 9999 -> A001
  if (sb[0] == '0') {
    sb[0] = 'A';

    if (sb[sb.Length - 1] == '0')
      sb[sb.Length - 1] = '1';

    return sb.ToString();
  }

  // Leading letters AZ999 -> BA001
  for (int i = value.Length - 1; i >= 0; --i) {
    if (sb[i] >= 'A') {
      if (sb[i] < 'Z') {
        sb[i] = (char)(sb[i] + 1);

        if (sb[sb.Length - 1] == '0')
          sb[sb.Length - 1] = '1';

        return sb.ToString();
      }
      else
        sb[i] = 'A';
    }
  }

  // All letters increment: ABCDZ -> ABCEA
  for (int i = 0; i < value.Length; ++i) {
    if (sb[i] == '0') {
      sb[i] = 'A';

      if (sb[sb.Length - 1] == '0')
        sb[sb.Length - 1] = '1';

      return sb.ToString();
    }
  }

  // Exhausting: ZZZZZ -> 00000
  return new string('0', value.Length);
}
Run Code Online (Sandbox Code Playgroud)

如果要枚举这些值:

private static IEnumerable<string> Generator(int length = 5) {
  string item = new string('0', length);

  do {
    yield return item;

    item = GetNextValue(item);
  }
  while (!item.All(c => c == '0'));
}
Run Code Online (Sandbox Code Playgroud)

演示:(让我们使用一个长度的字符串3

Console.Write(string.Join(Environment.NewLine, Generator(3)));
Run Code Online (Sandbox Code Playgroud)

结果:27234共0条;18769482项目若length == 5

000
001
002
...
009
010
...
999
A01
...
A99
B01
...
Z99
AA1
...
AA9
AB1
...
AZ9
BA1
...
ZZ9
AAA
AAB
AAC
...
AAZ
ABA
...
ZZY
ZZZ
Run Code Online (Sandbox Code Playgroud)