C# C语言中的自定义数字系统#
我对C#中的自定义数字系统有如下要求:C# C语言中的自定义数字系统#,c#,math,number-systems,C#,Math,Number Systems,我对C#中的自定义数字系统有如下要求: A - 1 B - 2 ... Z - 26 AA - 27 AB - 28 我制作了一个函数,可以将任意字符串转换为如下数字: private const int Min = 'A'; private const int Max = 'Z'; private const int Base = Max - Min + 1; private static int GetCharValue(char c) {
A - 1
B - 2
...
Z - 26
AA - 27
AB - 28
我制作了一个函数,可以将任意字符串转换为如下数字:
private const int Min = 'A';
private const int Max = 'Z';
private const int Base = Max - Min + 1;
private static int GetCharValue(char c)
{
if (c < Min || c > Max)
throw new ArgumentOutOfRangeException(nameof(c), c, $"Character needs to be between '{Min}' and '{Max}', was '{c}'.");
return c - Min + 1;
}
public static int GetStringValue(string s)
{
char[] chars = s.ToCharArray();
int[] values = new int[chars.Length];
for (var i = 0; i < chars.Length; i++)
{
values[i] = GetCharValue(chars[i]);
}
int position = 1;
int value = 0;
for (var i = values.Length - 1; i >= 0; i--)
{
value += position * values[i];
position *= Base;
}
return value;
}
private const int Min='A';
私有常量int Max='Z';
私有常量int Base=Max-Min+1;
私有静态int GetCharValue(char c)
{
如果(cMax)
抛出新ArgumentOutOfRangeException(nameof(c),c,$“字符需要介于{Min}和{Max}之间,是{c}.”;
返回c-Min+1;
}
公共静态整型GetStringValue(字符串s)
{
char[]chars=s.ToCharArray();
int[]值=新的int[chars.Length];
对于(变量i=0;i=0;i--)
{
值+=位置*值[i];
位置*=基础;
}
返回值;
}
我已经测试过它的工作效率高达
AAA
(不严格,只需浏览一下打印它们的输出)。然而,我一辈子都不知道如何编写反向函数。换句话说,我需要1
返回A
,26
返回Z
,27
返回AA
。“问题”是这个数字系统没有0,所以它不容易转换成任何基数。例如,如果A
为0,那么AA
也将为0,但不是。那么我该如何解决这个问题呢?您可以像这样简单地生成它
public static IEnumerable<string> generate()
{
long n = -1;
while (true) yield return toBase26(++n);
}
public static string toBase26(long i)
{
if (i == 0) return ""; i--;
return toBase26(i / 26) + (char)('A' + i % 26);
}
public static void BuildQuery()
{
IEnumerable<string> lstExcelCols = generate();
try
{
string s = lstExcelCols.ElementAtOrDefault(1) ;
}
catch (Exception exc)
{
}
}
公共静态IEnumerable generate()
{
长n=-1;
而(真)收益率为26(++n);
}
公共静态字符串toBase26(长i)
{
如果(i==0)返回“”;i--;
返回toBase26(i/26)+(char)('A'+i%26);
}
公共静态void BuildQuery()
{
IEnumerable lstExcelCols=generate();
尝试
{
字符串s=lstExcelCols.ElementAtOrderFault(1);
}
捕获(异常exc)
{
}
}
…或AAA
是703
?似乎您正在尝试创建一个基本编号系统。。。但是我不认为AA应该代表你认为它做了什么“问题”是你的数字系统确实有一个零,但它是不一致的。这是一个奇怪的不是真正的位置系统。在AA
中,第一个A
为一,而第二个A
为零。AAA
是指011010100101110。。。?实际需求是什么,只是客户的一些模糊期望,而客户并不真正知道他想要什么?或者您正在尝试复制Excel的坐标系?@DavidG:int result=source.Aggregate(0,(s,a)=>s*26+a-'a'+1)代码>其中source=“AAA”代码>这是正确的吗?