如何在C#中增加混合字母数字?
我在一个项目中要求生成字母数字值的连续行和列 最终用户将传递他希望从中开始的行和列的起始值,以及他希望生成的行和列的数量 对于字母,最大值为Z 对于数字,最大值为9 如果最终用户传递了这些参数: StartRow=0A StartColumn=A9Z rowsCount=2 columnsCount=5 我想得到这个结果:如何在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
我提出了一个非常简单的解决方案来实现这一点,我想与大家分享这个控制台应用程序:
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;
}