Введите цифры от 1 до 10, установите курсор в начало и перезапустите запись.

Я просто пришел к странному поведению, которое не могу объяснить. У меня есть консольное приложение, которое записывает числа от 1 до 9, а затем снова устанавливает курсор на начало окна консоли. После этого цикл продолжается и перезапускает запись чисел от 1 до 10. Проблема заключается в том, что числа, написанные до, перезаписываются, а не перемещаются вперед.

Мой код для лучшего понимания:

int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int counter = 0; counter < 10; counter++)
{
    foreach (int number in numbers)
    {
        Console.Write(number + " ");
        Thread.Sleep(5);
    }
    Console.SetCursorPosition(0, 0);
}

Когда я добавляю строку Console.Write("Test"); ниже Console.SetCursorPosition(0, 0);Я получаю следующий вывод:

Test1 2 3 4 5 6 7 8 9

Чего я не ожидал: при добавлении Console.Write(1); ниже я получаю

1 2 3 4 5 6 7 8 9

С моим кодом я хотел добиться следующего:

1 2 3 4 5 6 7 8 9 [теперь устанавливаем позицию курсора в начало и перемещаем состоящие числа вперед] 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 [и так далее]

Почему программа не ведет себя так?

2 ответа

Решение

Очевидно, когда вы установите курсор консоли на 0,0, вы начнете перезаписывать предыдущие значения, из-за этого это произойдет. Вы можете сделать это легко с конкатенацией строк, но я советую вам использовать StringBuilder потому что это изменчиво.

    public static void Main(string[] args)
    {
        StringBuilder sb = new StringBuilder();

        int[] numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        for (int counter = 0; counter < 10; counter++)
        {
            StringBuilder numberBuilder = new StringBuilder();
            foreach (int number in numbers)
            {
                numberBuilder.Append(number + " ");
            }

            sb.Insert(0, numberBuilder.ToString());
        }

        Console.WriteLine(sb.ToString());
    }

Вот пример дотнетовой скрипки

Консоль похожа на холст, когда что-то записывается, текст "закрашивается", пока что-то не закрасит или не сотрет его.

Когда вы перемещаете курсор в начало, вы начинаете перезаписывать старый текст, буква за буквой. Смотрите этот пример

Console.Write("This is some long text");
Console.SetCursorPosition(0, 0);
for(int i = 0; i < 30; i++)
{
    Console.Write("z");
    Thread.Sleep(1000);
}

Вы можете видеть текст, написанный медленно, по одной букве в секунду.

Чтобы получить эффект, который вы ищете, вам нужно сохранить буфер в памяти всей строки и отредактировать этот строковый буфер, после обновления буфера вы должны снова выписать всю строку. Простой способ это использовать StringBuilder действовать как буфер (ОБНОВЛЕНИЕ: см . ответ mybirthname для примера использования)

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