C# - Почему я должен нажать Enter дважды, чтобы зафиксировать Console.Readline - PullRequest
0 голосов
/ 30 марта 2020

C# newb ie. Попытка создать простую программу успеваемости, в которой пользователь:

  1. Вводит имена учеников до тех пор, пока не будет введено «готово»
  2. Введите оценки для каждого пользователя, затем вычислите среднее значение

Часть 2 работает, но моя проблема с первой частью - вам нужно дважды нажать клавишу ввода, чтобы зафиксировать имя в списке. Например, если я введу Боба, Лизу, Кевина, Джейн - только Боб и Кевин будут делать это - вторая строка (даже если вы что-то наберете) действует как строка, где console.read фиксируется в списке.

Вот мой код:

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

namespace Csharp
{

    class MainClass
    {
        static List<string> mylist = new List<string> { };
        public static void Main(string[] args)
        {

            UserInput();
            GradeEnter();
        }
        public static void UserInput()
        {
            Console.WriteLine("Enter Some names (type 'done' when finished)");
            do
            {
                mylist.Add(Console.ReadLine());
            } while (!Console.ReadLine().Equals("done"));


        }
        public static void GradeEnter()
        {

            foreach (var x in mylist)
            {
                List<int> myInts = new List<int>();
                Console.WriteLine("\nEnter grades for {0}, (enter any letter when done)", x);
                while (Int32.TryParse(Console.ReadLine(), out int number))
                {
                    myInts.Add(number);
                }
                Console.Write("Average is ");
                Console.Write(myInts.Average());

            }
        }

    }
}

Любая помощь по этому вопросу будет высоко ценится!

Спасибо

Ответы [ 3 ]

2 голосов
/ 30 марта 2020

Вы дважды звоните в ReadLine. Вместо этого вы можете попробовать это:

public static void UserInput()
{
    Console.WriteLine("Enter Some names (type done to exit)");
    string name = Console.ReadLine();
    while (!name.Equals("done"));
    {
        mylist.Add(name);
        name = Console.ReadLine();
    } 
}

Другой способ сделать то же самое

public static void UserInput()
{
    Console.WriteLine("Enter Some names (type done to exit)");
    while (true);
    {
        string name = Console.ReadLine();
        if (name == "done")
        {
            // This will stop the while-loop
            break;
        } 
        mylist.Add(name);
    } 
}

Теперь давайте проанализируем, что делает ваш код

        do
        {
            // Read line and add it to the list. Even if the user writes "done" 
            mylist.Add(Console.ReadLine());

        // Read the console again, if the user enters done, exit. But if the user enters other name, you are discarding it, you are not adding it to the list
        } while (!Console.ReadLine().Equals("done"));

Некоторые тестовые случаи используя ваш код:

1. Peter <- gets added to the list
2. Lucas <- does not get added to the list, just checks if it is done
3. Mario <- gets added to the list
4. Juan  <- again, just checking if it is done, so not added to the list
5. done  <- It is treated like a name, so it will be added to the list
6. done  <- now it will finish :) 
1 голос
/ 30 марта 2020

Чтение name один раз , а затем либо добавьте его в myList, либо остановите цикл:

public static void UserInput() {
  Console.WriteLine("Enter Some names (type done to exit)");

  for (string name = Console.ReadLine(); !name.Equals("done"); name = Console.ReadLine()) 
    mylist.Add(name);
}
0 голосов
/ 31 марта 2020

Спасибо всем за помощь. В итоге я использовал комбинацию while (true) и оператора if:

Console.WriteLine("Enter some names (type 'done' when finished)");
            do
            {
                string name = Console.ReadLine();
                if (!name.Equals("done"))
                {
                    mylist.Add(name);
                }
                else
                    break;


            } while (true);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...