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) {

我对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”这是正确的吗?