-8

顺序应该是这样的。
AZ,AA-AZ,BA-BZ,CA-CZ,.......,ZA-ZZ ZZ之后
应该从AAA开始。 然后AAAZZZ,然后AAAAZZZZ等等。

这个序列非常类似于 Excel 工作表。

编辑:添加了我的代码

        private void SequenceGenerator()
    {
        var numAlpha = new Regex("(?<Numeric>[0-9]*)(?<Alpha>[a-zA-Z]*)");
        var match = numAlpha.Match(txtBNo.Text);

        var alpha = match.Groups["Alpha"].Value;
        var num = Convert.ToInt32(match.Groups["Numeric"].Value);
        lastChar = alpha.Substring(alpha.Length - 1);

        if (lastChar=="Z")
        {
            lastChar = "A";
            txtBNo.Text = num.ToString() + "A" + alpha.Substring(0, alpha.Length - 1) + lastChar;
        }

        else
        {
            txtBNo.Text = num.ToString() + alpha.Substring(0, alpha.Length - 1) + Convert.ToChar(Convert.ToInt32(Convert.ToChar(lastChar)) + 1);
        }
    }

这就是我所做的。但是,我知道这是一个错误的逻辑。

谢谢。

4

3 回答 3

8

正如我在评论中所写,这是一个基本转换问题,您的输出为base-26,符号为AZ

static string NumToLetters(int num)
{
    string str = string.Empty;

    // We need to do at least a "round" of division
    // to handle num == 0
    do
    {
        // We have to "prepend" the new digit
        str = (char)('A' + (num % 26)) + str;
        num /= 26;
    }
    while (num != 0);

    return str;
}
于 2015-03-12T08:21:27.893 回答
2

你很幸运,我以前做过一次。我遇到的问题是在 Excel 工作表中没有 0,甚至在双“数字”“数字”中也没有。这意味着您从 a(即 1)开始,然后从 z(即 26)直接进入 aa(27)。这就是为什么不是一个简单的基本转换问题,您需要一些额外的代码来处理这个问题。测试 xanatos 建议的函数结果如下:

NumToLetters(0) --> A

NumToLetters(25) --> Z

NumToLetters(26) --> BA

我的解决方案有更多代码,但它已经针对 Excel 进行了测试并且完全兼容,除了它以 0 而不是 1 开头,这意味着 a 是 0,z 是 25,aa 是 26,zz 701,aaa 是 702 等等) . 如果需要,您可以将其更改为从 1 开始,这相当容易。

private static string mColumnLetters = "zabcdefghijklmnopqrstuvwxyz";

// Convert Column name to 0 based index
public static int ColumnIndexByName(string ColumnName)
    {
        string CurrentLetter;
        int ColumnIndex, LetterValue, ColumnNameLength;
        ColumnIndex = -1; // A is the first column, but for calculation it's number is 1 and not 0. however, Index is alsways zero-based.
        ColumnNameLength = ColumnName.Length;
        for (int i = 0; i < ColumnNameLength; i++)
        {
            CurrentLetter = ColumnName.Substring(i, 1).ToLower();
            LetterValue = mColumnLetters.IndexOf(CurrentLetter);
            ColumnIndex += LetterValue * (int)Math.Pow(26, (ColumnNameLength - (i + 1)));
        }
        return ColumnIndex;
    }

// Convert 0 based index to Column name
public static string ColumnNameByIndex(int ColumnIndex)
    {
        int ModOf26, Subtract;
        StringBuilder NumberInLetters = new StringBuilder();
        ColumnIndex += 1; // A is the first column, but for calculation it's number is 1 and not 0. however, Index is alsways zero-based.
        while (ColumnIndex > 0)
        {
            if (ColumnIndex <= 26)
            {
                ModOf26 = ColumnIndex;
                NumberInLetters.Insert(0, mColumnLetters.Substring(ModOf26, 1));
                ColumnIndex = 0;
            }
            else
            {
                ModOf26 = ColumnIndex % 26;
                Subtract = (ModOf26 == 0) ? 26 : ModOf26;
                ColumnIndex = (ColumnIndex - Subtract) / 26;
                NumberInLetters.Insert(0, mColumnLetters.Substring(ModOf26, 1));
            }
        }
        return NumberInLetters.ToString().ToUpper();
    }
于 2015-03-12T08:42:07.717 回答
1

试试这个方法:

public static IEnumerable<string> GenerateItems()
{
    var buffer = new[] { '@' };
    var maxIdx = 0;
    while(true)
    {
        var i = maxIdx;
        while (true)
        {
            if (buffer[i] < 'Z')
            {
                buffer[i]++;
                break;
            }

            if (i == 0)
            {
                buffer = Enumerable.Range(0, ++maxIdx + 1).Select(c => 'A').ToArray();
                break;
            }

            buffer[i] = 'A';
            i--;
        }

        yield return new string(buffer);
    }
    // ReSharper disable once FunctionNeverReturns
}

这是您需要的字母序列的无限生成器,您必须限制这样的项目数:

var sequence = GenerateItems().Take(10000).ToArray();

不要这样称呼它(它会导致无限循环):

foreach (var i in GenerateItems())
    Console.WriteLine(i);
于 2015-03-12T09:22:53.217 回答