如何在C#中增加混合字母数字?

如何在C#中增加混合字母数字?,c#,algorithm,increment,alphanumeric,C#,Algorithm,Increment,Alphanumeric,我在一个项目中要求生成字母数字值的连续行和列 最终用户将传递他希望从中开始的行和列的起始值,以及他希望生成的行和列的数量 对于字母,最大值为Z 对于数字,最大值为9 如果最终用户传递了这些参数: StartRow=0A StartColumn=A9Z rowsCount=2 columnsCount=5 我想得到这个结果: 我提出了一个非常简单的解决方案来实现这一点,我想与大家分享这个控制台应用程序: class Program { static void Main(string[] a

我在一个项目中要求生成字母数字值的连续行和列

最终用户将传递他希望从中开始的行和列的起始值,以及他希望生成的行和列的数量

对于字母,最大值为Z

对于数字,最大值为9

如果最终用户传递了这些参数:

StartRow=0A

StartColumn=A9Z

rowsCount=2

columnsCount=5

我想得到这个结果:


我提出了一个非常简单的解决方案来实现这一点,我想与大家分享这个控制台应用程序:

class Program
{
    static void Main(string[] args)
    {
        var row = "0A";
        var column = "A9Z";
        var rowsCount = 2;
        var columnsCount = 5;
        var rowCharArray =row.ToArray().Reverse().ToArray();
        var columnCharArray = column.ToArray().Reverse().ToArray();
        for (int i = 0; i < rowsCount; i++)
        {
            for (int j = 0; j < columnsCount; j++)
            {
                columnCharArray = incrementChar(columnCharArray);
                var currentColumn = string.Join("", columnCharArray.Reverse().ToArray());
                var currentRow= string.Join("", rowCharArray.Reverse().ToArray());

                Console.WriteLine(currentRow  + "-" + currentColumn);
            }
            columnCharArray = column.ToArray().Reverse().ToArray();
            rowCharArray= incrementChar(rowCharArray);
            Console.WriteLine("-------------------------------");
        }

        Console.ReadLine();
    }

    static char[] incrementChar(char[] charArray,int currentIndex=0)
    {
        char temp = charArray[currentIndex];

        if (charArray.Length -1 == currentIndex && (temp == '9' || temp == 'Z'))
            throw new Exception();

        temp++;
        if(Regex.IsMatch(temp.ToString(),"[A-Z]"))
        {
            charArray[currentIndex] = temp;
        }
        else
        {
            if (Regex.IsMatch(temp.ToString(), "[0-9]"))
            {
                charArray[currentIndex] = temp;
            }
            else
            {
                currentIndex++;
                incrementChar(charArray, currentIndex);
            }
        }
        if (currentIndex != 0)
            charArray = resetChar(charArray, currentIndex);

        return charArray;
    }

    static char[] resetChar(char[] charArray,int currentIndex)
    {
        for (int i = 0; i < currentIndex; i++)
        {
            if (charArray[i] == 'Z')
                charArray[i] = 'A';
            else if (charArray[i] == '9')
                charArray[i] = '0';
        }
        return charArray;
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var row=“0A”;
var column=“A9Z”;
var Rowsunt=2;
var columnsCount=5;
var rowCharArray=row.ToArray().Reverse().ToArray();
var columnCharArray=column.ToArray().Reverse().ToArray();
for(int i=0;i
您可能需要重新考虑您的方法。与其维护字母数字值并尝试增加它,不如将该值作为包含
值的类来维护,然后使用
ToString
将其转换为字母数字表示。像这样:

class RowCol
{
    private int _row;
    private int _col;

    public int Row
    {
        get { return _row; }
        set
        {
            // Row is of the form <digit><letter
            // giving you 260 possible values.
            if (value < 0 || value > 259)
                throw new ArgumentOutOfRangeException();
            _row = value;
        }
    }

    public int Col
    {
        get { return _col; }
        set
        {
            // Col is <letter><digit><letter>,
            // giving you 6,760 possible values
            if (value < 0 || value > 6759)
                throw new ArgumentOutOfRangeException();
            _col = value;
        }
    }

    public string RowString
    {
        get
        {
            // convert Row value to string
            int r, c;
            r = Math.DivMod(_row, 26, out c);
            r += '0';
            c += 'A';
            return string.Concat((char)r, (char)c);
        }
        set
        {
            // convert string to number.
            // String is of the form <letter><digit>
            if (string.IsNullOrEmpty(value) || value.Length != 2
                || !Char.IsDigit(value[0] || !Char.IsUpper(value[1]))
                throw new ArgumentException();
            _row = 26*(value[0]-'0') + (value[1]-'A');
        }
    }

    public string ColString
    {
        get
        {
            int left, middle, right remainder;
            left = Math.DivRem(_col, 260, out remainder);
            middle = Math.DivRem(remainder, 26, out right);
            left += 'A';
            middle += '0';
            right += 'A';
            return string.Concat((char)left, (char)middle, (char)right);
        }

        set
        {
            // Do standard checking here to make sure it's in the right form.
            if (string.IsNullOrEmpty(value) || value.Length != 3
                || !Char.IsUpper(value[0] || !Char.IsDigit(value[1]) || !Char.IsUpper(value[2]))
                throw new ArgumentException();

            _col = 260*(value[0] - 'A');
            _col += 26*(value[1] - '0');
            _col += value[2] - 'A';
        }
    }

    public override string ToString()
    {
        return RowString + '-' + ColString;
    }

    public RowCol(int row, int col)
    {
        Row = _row;
        Col = _col;
    }

    public RowCol(string row, string col)
    {
        RowString = row;
        RowString = col;
    }
}

通过将此问题转化为一个简单的转换问题并封装在一个类中,我使代码更加健壮、灵活,更易于测试、理解和使用。

我不知道为什么这个问题被否决?@PaulF你说得对。我也在下面贴了一个简单的答案。感谢您回复我的代码-我现在意识到我错了-您正在独立地递增字母和数字-因此“0Z”+1将是“1A”,而base36将是“10”“PaulF Yea,我在我的问题中提到过,如果传递的字符是字母,max是Z,它的最大值是9,你刚才问并在同一分钟内回答你自己的问题吗?你可以考虑用正则表达式来替换你的正则表达式。说得更有道理。谢谢你的回答。我同意你的观点,但我提供的代码片段只是为了演示和简单起见,甚至我在main方法中硬编码了输入参数。
string startRow = "0A";
string startCol = "B0A";
RowCol rc = new RowCol("0A", "B0A");
for (int r = 0; r < rowsCount; r++)
{
    rc.ColString = "B0A";
    for (int c = 0; c < columnsCount; c++)
    {
        Console.WriteLine(rc);
        rc.Row = rc.Row + 1;
    }
    rc.Col = rc.Col + 1;
}