Введите цифры от 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 для примера использования)