есть ли способ взять int превратить его в строку, а затем снова в int - PullRequest
0 голосов
/ 01 ноября 2019

я хочу получить длину числа. я знаю, что могу сделать это с помощью цикла while и деления на 10, пока число не достигнет 0, но это займет около 10 строк кода, и я думаю, что было бы намного быстрее и гораздо эффективнее сделать это таким образом.

using System;

int[] array = new int[5]{1,12,123,1234,12345};
int[] length = new int[array.Length];
int i = 0;

while (i < 0)
{
    length[i] = int.Parse(((array[i]).ToString()).Length);
    i++;
}

i = 0;
while (i < array.Length)
{
    Console.Write("{0} ", length);
    i++;
}

по какой-то причине, когда я говорю ему печатать длину кода каждого числа вместо того, чтобы печатать длину (1, 2, 3, 4, 5), просто печатает system.int32 [] 5 раз

Ответы [ 2 ]

2 голосов
/ 01 ноября 2019

Вам не нужно разбирать .Length, так как Length return int;Ваш код изменен:

  int[] array = new int[] {1, 12, 123, 1234, 12345};
  //TODO: you may want to put a better name here, say, digitCount
  // see comments below 
  int[] length = new int[array.Length];

  for (int i = 0; i < array.Length; ++i)
    length[i] = array[i].ToString().Length;

  for (int i = 0; i < length.Length; ++i)
    Console.Write("{0} ", length[i]);

Вы можете запросить array с помощью Linq :

  using System.Linq;

  ... 

  int[] array = new int[] {1, 12, 123, 1234, 12345};

  int[] length = array
    .Select(item => item.ToString().Length)
    .ToArray();

И напечатать length за один раз спомощь Join:

  Console.Write(string.Join(" ", length));
1 голос
/ 01 ноября 2019

Это потому, что length - это массив, а не фактический элемент (который, я думаю, вы хотите напечатать). Исправить несложно, замените Console.Write("{0} ", length); на Console.Write("{0} ", length[i]);

Вот несколько советов для вашего кода:

Я вижу, что вы используете циклы while для итерации по всему, поэтомуя расскажу вам немного о цикле другого типа, цикле for. for обычно используется для выполнения чего-то x раз и строится примерно так:

for (int i = 0; i < length.Length; i++)

Это может показаться сложным, но на самом деле это довольно просто, позвольте мне объяснить. Мы можем разбить цикл for на 3 секции. Объявление итератора, условие итерации и приращение. int i = 0 является объявлением итератора, здесь мы объявляем и определяем переменную с именем i, которая является int со значением 0. В следующем блоке (i < length) мы объявляем условие, когда это условие равно true, мы продолжаем идти, когда оно ложно, мы прекращаем цикл. И, наконец, инкремент или шаг (i++), он выполняется после каждого цикла и увеличивает итератор (i в этом случае) на 1. Перезапись кода с помощью циклов for приводит к следующему:

int[] array = new int[] {1, 12, 123, 1234, 12345};
int[] length = new int[array.Length];

for (int i = 0; i < array.Length; i++)
{
    length[i] = int.Parse(((array[i]).ToString()).Length);
}

for (int i = 0; i < length.Length; i++)
{
    Console.WriteLine("{0} ", length[i]);
}

Это можно еще улучшить, например, в настоящее время мы дважды перебираем те же данные, что по существу, что означает, что мы тратим время. А также, поскольку массивы перечисляются в C #, мы можем использовать цикл foreach. Это другой тип цикла, который почти такой же, как цикл for, но вместо того, чтобы делать что-то x количество раз, которое мы используем для чего-то с каждым элементом перечислимого элемента. Используя его, мы можем сделать это:

int[] array = new int[] {1, 12, 123, 1234, 12345};

foreach (int element in array)
{
    Console.WriteLine($"{element.ToString().Length} ");
}

Я также использовал то, что называется интерполяция строк ($ перед ")

...