консоль c #, проблема Console.Clear - PullRequest
11 голосов
/ 18 декабря 2008

Я пишу консольную программу на C #.

Можно ли использовать Console.Clear (), чтобы очистить только некоторые вещи на экране консоли?

Вот моя проблема:

У меня есть логотип (я помещаю его на экран с помощью Console.WriteLine ()) и двумерный массив, который я хочу сохранить постоянным и очистить все, что находится под ним.

Ответы [ 3 ]

22 голосов
/ 18 декабря 2008

Вы можете использовать пользовательский метод для очистки частей экрана ...

static void Clear(int x, int y, int width, int height)
{
    int curTop = Console.CursorTop;
    int curLeft = Console.CursorLeft;
    for (; height > 0;)
    {
        Console.SetCursorPosition(x, y + --height);
        Console.Write(new string(' ',width));
    }
    Console.SetCursorPosition(curLeft, curTop);
}
8 голосов
/ 18 декабря 2008

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


Сохраните логотип и первоначально сгенерированное состояние массива, а затем, когда вы очистите консоль, снова запишите сохраненные значения, вместо того, чтобы использовать ту же процедуру генерации.

Как уже говорили другие, консоль не предназначена для такого рода операций, поэтому вам придется обходить ее.

Другим вариантом может быть запись в строку или построитель строк, а не непосредственно в консоль, а затем всякий раз, когда консоль нуждается в обновлении, очищайте ее вывод и записывайте свою «выходную» строку / поток в консоль. Это позволит вам выполнять строковые операции / регулярные выражения и т. Д. Для выходного текста, чтобы удалить / оставить определенные элементы на месте.

Однако это потребует значительных накладных расходов на консоль, поскольку в конечном итоге вы перепечатываете весь вывод при каждом обновлении.

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

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

1 голос
/ 18 декабря 2008

Не можете ли вы очистить, а затем переписать логотип и массив? Консоль не предназначена для использования, как вы описываете.

...