不知道如何阅读这种方法

时间:2017-01-20 15:04:05

标签: c# for-loop

这是什么功能,我的意思是0x30的部分?指向ASCII表的十六进制值? 这可能是基本的东西,而且我目前没有知识。

getCompleteCode("11111");

private string getCompleteCode(string code)
        {
            var b1 = 10;
            var b2 = 20;
            var sum = 0;
            for (var i = code.Length - 1; i >= 0; i--) 
            {
                var z = code[i] - 0x30;
                sum = sum + (z + b1) * b2;

            }

            Console.WriteLine(sum);

            return code;
}

5 个答案:

答案 0 :(得分:3)

一个不应该实现逻辑的一个很好的例子:

    // why not static?
    private string getCompleteCode(string code)
    {
        // what does "b1" as well as "b2" stand for?
        var b1 = 10;
        var b2 = 20;
        var sum = 0;
        // the reason for the loop being in reversed order? 
        for (var i = code.Length - 1; i >= 0; i--) 
        {
            // the question put - what does 0x30 stand for - it's ascii code of '0' char 
            // so, why magic code 0x30 instead of evident '0'?
            var z = code[i] - 0x30;
            sum = sum + (z + b1) * b2;
        }

        // what if I want to compute it in, say, WinForms?? 
        // Never mix business logic (computing some code) and UI (output) 
        Console.WriteLine(sum);

        // we've done a lot of stuff just to return the initial input?? 
        return code;
    } 

我对实施的建议(假设code保证是正确的输入):

    //TODO: think on a better name for the method
    private static int getCompleteCode(string code) {
      return code.Sum(c => (c - '0' + 10) * 20);
    }

    ...

    Console.WriteLine(getCompleteCode("11111")); 

答案 1 :(得分:1)

0x30是' 0'的ascii值。 ...它通常用于从字符中减去,例如' 8' - 在转换为整数之后(0x30 = 8)(隐式或显式地像这里)。

答案 2 :(得分:1)

正如其他人所解释的那样,var z = code[i] - 0x30是获取数字字符值的标准代码。正如Glorin Oakenfoot所提到的,这段代码不做任何边界检查。所以它适用于'0' - 0x30(实际上,那是'0' - '0',顺便说一句),以及'9' - 0x30。但它也会产生像'A'这样的奇怪 - 0x30 = 32。

格洛林的评论也是对的 - 其余的数字似乎都是针对具体情况的。它似乎可能是一个哈希函数 - 它为给定的字符串计算一个主要唯一的数字。我将引导您完成循环,但它正在做的事情没有任何真正的意义。而不是输入“11111”,让我们看看“12345”:

第一次循环:i = 4,代码[i] ='5',z = 5,sum = 0 + 15 * 20 = 300

第二次循环:i = 3,代码[i] ='4',z = 4,sum = 300 + 14 * 20 = 580

第3次循环:i = 2,代码[i] ='3',z = 3,sum = 580 + 13 * 20 = 840

第4次循环:i = 1,代码[i] ='2',z = 2,sum = 840 + 12 * 20 = 1080

第5次循环:i = 0,代码[i] ='1',z = 1,sum = 1080 + 11 * 20 = 1300

正如我所提到的,它可能用于散列。您输入的每个数字字符串都可能具有唯一的整数代码。散列字符串可以提高效率。如果没有别的,它会给你一个相当强大的测试比较。见https://en.wikipedia.org/wiki/Hash_function

当然,大多数字符串哈希函数都不会从数字转换为int。如果函数要求输入只是数字,正如转换为int所暗示的那样,此字符串的最简单的散列就是将其解析为整数。

这让我想起的另一件事是尝试将整数字符串解析为数字。这将非常相似,但请注意以下差异:

var sum = 0
for (var i = 0; i < code.Length; i++)
{
    var z = code[i] - '0' // this is the same as - 0x30, but more clear to read
    sum = sum * 10 + z
}

考虑到函数的名称,它似乎更有可能是作为哈希函数。

答案 3 :(得分:0)

0x30 y数字0的十六进制ASCII码,因此z实际上会给出数字类型的数字。

答案 4 :(得分:-1)

删除小数。它=无论数字四舍五入。