Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不使用其他类库的情况下编写toString方法_C# - Fatal编程技术网

C# 如何在不使用其他类库的情况下编写toString方法

C# 如何在不使用其他类库的情况下编写toString方法,c#,C#,我想写我自己的toString方法,因为我不允许使用任何类库 所以我研究了toString方法的源代码,但是它使用了很多其他库。我想把一个整数转换成一个字符串,但我不确定如何逐个处理这些数字 如果我能做到这一点,我可以继续将整数转换成一个字符,最后将所有字符相加成一个字符串 有人能帮忙吗?我不明白为什么不允许你使用任何库。但是如果你需要完全用手进行转换,你可以这样做 private static string IntToString(int i) { string[] digits =

我想写我自己的toString方法,因为我不允许使用任何类库

所以我研究了toString方法的源代码,但是它使用了很多其他库。我想把一个整数转换成一个字符串,但我不确定如何逐个处理这些数字

如果我能做到这一点,我可以继续将整数转换成一个字符,最后将所有字符相加成一个字符串


有人能帮忙吗?

我不明白为什么不允许你使用任何库。但是如果你需要完全用手进行转换,你可以这样做

private static string IntToString(int i)
{
    string[] digits = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
    string sign = (i < 0 ? "-" : "");
    var absI = (i < 0 ? -i : i);
    string result = "";
    while (absI != 0)
    {
        int digit = absI % 10;
        result = digits[digit] + result;
        absI = (absI - digit) / 10;
    }
    return sign + result;
}
私有静态字符串IntToString(inti)
{
字符串[]位={“0”、“1”、“2”、“3”、“4”、“5”、“6”、“7”、“8”、“9”};
字符串符号=(i<0?-“:”);
var absI=(i<0?-i:i);
字符串结果=”;
while(absI!=0)
{
整数位数=absI%10;
结果=位数[位数]+结果;
absI=(absI-数字)/10;
}
返回符号+结果;
}

上面的代码对于零来说不能正常工作。如果您需要,添加非常简单。

例如,您可以将数字拆分为单个字符:

// Note that this is just for example and for positive numbers only.
IEnumerable<char> ToChar(int num)
{
    while (num > 0)
    {
        // adding '0' to number will return char for that number
        char ch = (char)(num % 10 + '0');
        num /= 10;
        yield return ch;
    }
}
使用方法:

int i = 554;
string str = ToString(i);

参考资料:

以下是与其他答案类似的方法

要点:

  • 我们通过找到数字的余数除以10(即
    lastDigital=number%10;
    )时找到它的余数来计算数字的最后一个数字
  • 要扔掉数字的最后一位数字,只需将其除以10即可
  • 当以这种方式查找数字时,它们当然会以相反的顺序返回(首先是最低有效数字),因此您必须反转数字以获得正确答案。一种方法是从字符数组的末尾到开头进行存储
  • 负数必须特别处理。最简单的方法是注意数字是负数,以便在适当的时候添加
    -
    符号;然后,对数字求反,使其为正。但是,请注意,不能否定
    int.MinValue
    ,因此必须特别处理
  • 通过将数字添加到字符
    '0'
    并将结果转换回
    字符
    ,您可以将其从数字数字转换为等价的
    字符
  • 以下是一种利用这些要点的方法:

    public static string MyToString(int number)
    {
        if (number == int.MinValue)
            return "-2147483648"; // Special case.
    
        char[] digits = new char[64]; // Support at most 64 digits.
        int last = digits.Length;
        bool isNegative = number < 0;
    
        if (isNegative)
            number = -number;
    
        do
        {
            digits[--last] = (char) ('0' + number % 10);
            number /= 10;
        }
        while (number != 0);
    
        if (isNegative)
            digits[--last] = '-';
    
        return new string(digits, last, digits.Length-last);
    }
    
    公共静态字符串MyToString(整数)
    {
    if(number==int.MinValue)
    return“-2147483648”;//特殊情况。
    char[]digits=新字符[64];//最多支持64位。
    int last=位数。长度;
    bool为负=数值<0;
    如果(为负)
    数字=-数字;
    做
    {
    数字[--last]=(字符)(“0”+数字%10);
    数目/=10;
    }
    while(number!=0);
    如果(为负)
    数字[--last]='-';
    返回新字符串(数字、最后一个、数字、最后一个长度);
    }
    
    我想你问的主要部分是如何一个接一个地获取数字的数字,上面的
    do/while
    循环回答了这个问题



    [编辑]解决了下面评论中提出的问题。

    您能显示输入吗?您确定需要创建自己的ToString方法吗?可能需求只是“不要使用第三方库”,而不是使用
    系统
    库(其中包含大多数基本有用的内容,包括
    int.ToString()
    ),因为代码无论如何都会隐式引用它,所以不清楚约束的目的是什么。这是一个明确要求你重新发明轮子的家庭作业吗?我和杰罗恩在一起。如果不允许您使用(任何)libs,.net不适合您。几乎任何高级语言都不适合你。这真的没有道理。这肯定是一个家庭作业问题?不错,但对于
    int.MinValue
    (以相当有趣的方式--
    “0123456789”[number%10]
    失败得更明显)。此外,您可以立即反向存储数字,并取字符串的结尾,而不是开头,尽管我同意这不是练习的核心。@Jeroenmoster啊,是的,您不能否定int.MinValue。我想如果需要的话,你可以特别处理。从末尾开始存储数字的好主意。“我会更新的。”马修沃森非常感谢你,马修!我的问题是,我不明白如何处理一个数字的最后一个数字(数字一个接一个==数字一个接一个,我的坏…),我会以技术理由取消这个解决方案的资格。即使我们允许迭代器和
    IEnumerable
    作为语言的一部分,
    Enumerable.Reverse()
    Enumerable.ToArray()
    都是库调用(生活在
    System.Linq
    中)。否则,我们可能会有更多的LINQ骗局(
    .Range
    .Select
    .Join
    )。@jeroenmoster这并不是一个复制粘贴的解决方案,而是对OP问题的“帮助”或“指导”。
    public static string MyToString(int number)
    {
        if (number == int.MinValue)
            return "-2147483648"; // Special case.
    
        char[] digits = new char[64]; // Support at most 64 digits.
        int last = digits.Length;
        bool isNegative = number < 0;
    
        if (isNegative)
            number = -number;
    
        do
        {
            digits[--last] = (char) ('0' + number % 10);
            number /= 10;
        }
        while (number != 0);
    
        if (isNegative)
            digits[--last] = '-';
    
        return new string(digits, last, digits.Length-last);
    }