Выход из цикла "делать, пока ReadLine" не работает

Я пытаюсь изучать C#, поскольку у меня мало опыта там. Я хотел настроить Console.Readline в Do While цикл, так что я могу прочитать в неизвестном количестве значений в массив. Это никогда не выходит, поэтому сравнение в while не работает. Что случилось?

do
{
    line = Console.Read();
    if (line != null)
        numbers[c++] = line;
    numbers = new int[c+1];

} while (line != null);

2 ответа

Решение

Прежде всего, я бы использовал List<int> сохранить входные значения. Это исключает необходимость повторного измерения массива, и вы можете использовать список как обычный массив.

Во-вторых, существует большая разница между Console.Read и Console.ReadLine. Первый возвращает один за другим коды символов введенных символов, и нажатие клавиши Enter просто возвращает код символа (13) клавиши Enter. Чтобы выйти из цикла, вам нужно нажать Ctrl + Z, который возвращает -1, а не ноль.

List<int> numbers = new List<int>();
int line;
do
{
    line = Console.Read();
    if (line != -1)
        numbers.Add(line);
} while (line != -1);
for(int x = 0; x < numbers.Count(); x++)
   Console.WriteLine(numbers[x]);

Тем не менее, это, вероятно, не то, что вы действительно хотите. Если вам нужно сохранить числа, набранные в виде действительных целых чисел, вам нужен код, подобный следующему:

List<int> numbers = new List<int>();
string line = Console.ReadLine();
int number;
do
{
    if(int.TryParse(line, out number))
        numbers.Add(number);

} while (!string.IsNullOrWhiteSpace(line = Console.ReadLine()));
for(int x = 0; x < numbers.Count(); x++)
   Console.WriteLine(numbers[x]);

В этой версии я получаю линейный ввод перед входом в цикл, а затем продолжаю до тех пор, пока не будет нажата клавиша Enter. В каждом цикле я пытаюсь преобразовать входные данные в действительное целое число.

Обратите внимание также на использование TryParse для преобразования строки в целое число. Если ваш пользователь введет что-то вроде "abcdef", TryParse вернет false, не выдавая исключение.

(Спасибо Patrick за его предложение.)

Если вы используете Console.Readline() затем line будет null если вы нажмете Ctrl+Z (как упомянуто Patrick). Вместо этого вы должны проверить пустую строку:

    do
    {
        line = Console.ReadLine();
        if (line != null)
            numbers[c++] = int.Parse(line); //assigning string to the last element in the array of ints?
            //if you need to parse string to int, use int.Parse() or Convert.ToInt32() 
            //whatever suits your needs
        numbers = new int[c+1];

    } while (!string.IsNullOrEmpty(line));

В любом случае, неясно, чего вы пытаетесь достичь с помощью этого кода, поскольку вы создаете новый массив на каждой итерации. Более того, это не будет работать, так как у вас есть массив int но назначить string значение для этого.

Другие вопросы по тегам