将数字字符串拆分为数字并发送到数组

时间:2018-12-05 21:00:29

标签: c# arrays

我想拆分一个40位数字,并将每个数字发送到一个称为“数字”的数组中。 ToArray不起作用,因为它无法从char转换为int。我也不认为斯普利特吗?我很困惑

edit:这些是指令:创建一个HugeInteger类,该类使用由40个元素组成的数字数组来存储每个最大为40位数字的整数。提供方法Input,ToString,Add和Subtract。为了比较HugeInteger对象,请提供以下方法:IsEqualTo,IsNotEqualTo,IsGreaterThan,IsLessThan,IsGreaterThanOrEqualTo和IsLessThanOrEqualTo。每个方法都是一个方法,如果两个HugeInteger对象之间的关系成立,则返回true;如果关系不成立,则返回false。提供方法IsZero。在Input方法中,使用字符串方法ToCharArray将输入字符串转换为字符数组,然后遍历这些字符以创建HugeInteger。

4 个答案:

答案 0 :(得分:4)

string digits = "8957853759876839473454789595495735984339";
int[] array = digits.Select(x => (int)char.GetNumericValue(x)).ToArray();

int[] array = digits.Select(x => x - 48).ToArray();

@Haldo要求解释为什么该方法应该起作用,这是因为     char可隐式转换为int。 Live Demo

如果要避免在某些字符不能解析为数字的情况下获得Exception,则可以忽略它们:

int[] array = digits.Where(x => char.IsNumber(x)).Select(x => x - 48).ToArray();

答案 1 :(得分:1)

您可以使用Select扩展方法将字符转换为整数:

int[] result = str.Select(x => int.Parse(x.ToString()))
                  .ToArray();

或假设可能存在无效字符:

int[] result = str.Where(char.IsDigit)
                  .Select(x => int.Parse(x.ToString()))
                  .ToArray();

答案 2 :(得分:0)

要处理大量数字,最好的方法是将整数字符串转换为字节数组。因此,代码将十进制数转换为二进制byte []数组。是使用学校教授的方法使用长除法进行从十进制到十六进制的基数转换。

我使用0到2 ^ 24之间的每个数字彻底测试了代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication89
{
    class Program
    {
        static void Main(string[] args)
        {

            string digits = "8957853759876839473454789595495735984339";
            List<byte> results = Binary.GetBytes(digits);
            //test code
            //for (int i = 0; i < (Math.Pow(2,24)); i++)
            //{
            //    string digits = i.ToString();
            //    Console.WriteLine(i);
            //    List<byte> results = Binary.GetBytes(digits);
            //    long value = results.Select((x, j) => x << (j * 8)).Sum();
            //    if (i != value)
            //    {
            //        int a = 3;
            //    }
            //}
        }


    }
    public class Binary
    {
        public static List<byte> GetBytes(string input)
        {
            List<byte> results = new List<byte>();
            string divisorStr = input;


            int nibbleCount = 0;


            while (divisorStr.Length != 0)
            {
                int number = 0;
                string quotentStr = "";
                byte carry = 0;

                //divide a string by 16 to get remainders
                while (divisorStr.Length != 0)
                {
                    number = (carry * 10) + int.Parse(divisorStr.Substring(0, 1));
                    divisorStr = divisorStr.Substring(1);
                    if (divisorStr.Length == 0) exit = true;

                    int digit = number / 16;
                    if (quotentStr != "" | (digit != 0))
                    {
                        quotentStr += digit.ToString();
                    }
                    carry = (byte)(number % 16);
                }
                ///combine the remainders together into an array of bytes
                if (nibbleCount % 2 == 0)
                {
                    results.Add(carry);
                }
                else
                {
                    results[results.Count - 1] |= (byte)(carry << 4);
                }
                divisorStr = quotentStr;
                nibbleCount++;
            }
            return results;
        }
    }
}

答案 3 :(得分:-3)

由于您只希望将其放入char数组中,为什么不直接在.ToString()上调用int然后再调用.ToCharArray() p>

int nums = 123456789;

char[] numss = nums.ToString().ToCharArray();

foreach(char n in numss) {
    Console.Write(string.Format("{0} ", n));
}
// 1 2 3 4 5 6 7 8 9... 

由于我误解了问题并且每个人都在使用Select扩展名,为什么不只使用简单的for循环并将其转换为int

string nums = "12345";
int [] digits = new int[nums.Length];

for(int i = 0; i < nums.Length; i++) {
    digits[i] = Convert.ToInt32(Char.GetNumericValue(nums[i]));
}

foreach(int n in digits) {
    Console.Write(string.Format("{0} ", n));
}
// 1 2 3 4 5