Can Console.Clear只能用于清除一行而不是整个控制台

本文关键字:一行 控制台 Clear Console 用于 清除 Can | 更新日期: 2023-09-27 18:21:00

在为学校编写问答程序时,我突然想到我可以使用Console.Clear()清除屏幕上的所有内容。我想知道我是否可以使用Console.Readline(valueOne),然后只输出答案而不输出问题。如果我只问一个问题,那么Console.Clear是有效的。

我有几个问题是有价值的,而不是参考,如果可能的话可以删除。我想省略这些问题,只显示几个答案。我想如果我存储答案,我可以使用Console.Clear(),然后只使用带有三个变量的Console.WriteLine()。我可以这样做:

Console.WriteLine("Value 1 is: {0:c}" + "Value 2 is: {1:c}" + "Value 3 is: {2:c}, valueOne, valueTwo, valueThree).

引用的问题更容易解决,因为值是存储和检索的。如果我只是使用方法传递值并输出值,那么main()将不会引用那些值来清除并再次输出。这就是为什么我想知道我是否可以只问一个问题,然后删除行,只输出答案。

我只是想了解各种可能性,而不是试图设置一个程序。我想知道从参考和按值输出值的能力,而不需要额外的输出问题。

Can Console.Clear只能用于清除一行而不是整个控制台

描述

您可以使用Console.SetCursorPosition函数转到特定的行号。然后您可以使用此功能来清除行:

public static void ClearCurrentConsoleLine()
{
    int currentLineCursor = Console.CursorTop;
    Console.SetCursorPosition(0, Console.CursorTop);
    Console.Write(new string(' ', Console.WindowWidth)); 
    Console.SetCursorPosition(0, currentLineCursor);
}

样品

Console.WriteLine("Test");
Console.SetCursorPosition(0, Console.CursorTop - 1);
ClearCurrentConsoleLine();

更多信息

  • Console.SetCursorPosition方法

一个更简单、更好的解决方案是:

Console.Write("'r" + new string(' ', Console.WindowWidth) + "'r");

它使用回车符转到行的开头,然后打印与控制台宽度一样多的空格,然后再次返回到行的开始,这样您就可以在之后打印自己的测试。

"ClearCurrentConsoleLine"、"ClearLine"和上述其他函数应该使用Console.BufferWidth而不是Console.WindowWidth(当您尝试缩小窗口时,您可以看到原因)。控制台的窗口大小当前取决于其缓冲区,并且不能比它宽。示例(感谢Dan Cornelescu):

public static void ClearLastLine()
{
    Console.SetCursorPosition(0, Console.CursorTop - 1);
    Console.Write(new string(' ', Console.BufferWidth));
    Console.SetCursorPosition(0, Console.CursorTop - 1);
}

这对我有效:

static void ClearLine(){
    Console.SetCursorPosition(0, Console.CursorTop);
    Console.Write(new string(' ', Console.WindowWidth)); 
    Console.SetCursorPosition(0, Console.CursorTop - 1);
}

我的首选方法是使用PadRight。这不是先清除行,而是在显示新文本后清除行的剩余部分,从而保存一个步骤:

Console.CursorTop = 0;
Console.CursorLeft = 0;
Console.Write("Whatever...".PadRight(Console.BufferWidth));

我们可以简单地编写以下方法

public static void ClearLine()
{
    Console.SetCursorPosition(0, Console.CursorTop - 1);
    Console.Write(new string(' ', Console.WindowWidth));
    Console.SetCursorPosition(0, Console.CursorTop - 1);
}

然后在需要时调用它,就像这个

Console.WriteLine("Test");
ClearLine();

它对我来说很好。

要从当前位置清除到当前行的末尾,请执行以下操作:

    public static void ClearToEndOfCurrentLine()
    {
        int currentLeft = Console.CursorLeft;
        int currentTop = Console.CursorTop;
        Console.Write(new String(' ', Console.WindowWidth - currentLeft));
        Console.SetCursorPosition(currentLeft, currentTop);
    }
public static void ClearLine(int lines = 1)
{
    for (int i = 1; i <= lines; i++)
    {
        Console.SetCursorPosition(0, Console.CursorTop - 1);
        Console.Write(new string(' ', Console.WindowWidth));
        Console.SetCursorPosition(0, Console.CursorTop - 1);
    }
}

我想我发现了为什么这个问题有几个不同的答案。当窗口的大小调整为具有水平滚动条时(因为缓冲区比窗口大),Console.CursorTop似乎返回了错误的行。以下代码适用于我,无论窗口大小或光标位置如何。

public static void ClearLine()
{
    Console.SetCursorPosition(0, Console.CursorTop);
    Console.Write(new string(' ', Console.WindowWidth));
    Console.SetCursorPosition(0, Console.CursorTop - (Console.WindowWidth >= Console.BufferWidth ? 1 : 0));
}

如果没有(Console.WindowWidth>=Console.BufferWidth?1:0),代码可能会向上或向下移动光标,这取决于您在此页面中使用的版本以及窗口的状态。

这非常适合我,正如我所期望的那样-

    public static void ClearLine()
    {
        Console.SetCursorPosition(0, Console.CursorTop);
        Console.Write(new string(' ', Console.WindowWidth));
        Console.SetCursorPosition(0, Console.CursorTop);
    }