为了账号安全,请及时绑定邮箱和手机立即绑定

如何更新C#Windows控制台应用程序中的当前行?

如何更新C#Windows控制台应用程序中的当前行?

C#
汪汪一只猫 2019-07-23 16:02:43
如何更新C#Windows控制台应用程序中的当前行?在C#中构建Windows控制台应用程序时,是否可以写入控制台而无需扩展当前行或转到新行?例如,如果我想显示一个百分比表示一个进程完成的接近程度,我只想更新与光标在同一行的值,而不必将每个百分比放在一个新行上。这可以通过“标准”C#控制台应用程序完成吗?
查看完整描述

3 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

到目前为止,我们有三种竞争方案可供选择:


Console.Write("\r{0}   ", value);                      // Option 1: carriage return

Console.Write("\b\b\b\b\b{0}", value);                 // Option 2: backspace

{                                                      // Option 3 in two parts:

    Console.SetCursorPosition(0, Console.CursorTop);   // - Move cursor

    Console.Write(value);                              // - Rewrite

}

我总是使用Console.CursorLeft = 0,第三种选择的变种,所以我决定做一些测试。这是我使用的代码:

public static void CursorTest(){
    int testsize = 1000000;

    Console.WriteLine("Testing cursor position");
    Stopwatch sw = new Stopwatch();
    sw.Start();
    for (int i = 0; i < testsize; i++)
    {
        Console.Write("\rCounting: {0}     ", i);
    }
    sw.Stop();
    Console.WriteLine("\nTime using \\r: {0}", sw.ElapsedMilliseconds);

    sw.Reset();
    sw.Start();
    int top = Console.CursorTop;
    for (int i = 0; i < testsize; i++)
    {
        Console.SetCursorPosition(0, top);        
        Console.Write("Counting: {0}     ", i);
    }
    sw.Stop();
    Console.WriteLine("\nTime using CursorLeft: {0}", sw.ElapsedMilliseconds);

    sw.Reset();
    sw.Start();
    Console.Write("Counting:          ");
    for (int i = 0; i < testsize; i++)
    {        
        Console.Write("\b\b\b\b\b\b\b\b{0,8}", i);
    }

    sw.Stop();
    Console.WriteLine("\nTime using \\b: {0}", sw.ElapsedMilliseconds);}

在我的机器上,我得到以下结果:

  • 退格:25.0秒

  • 回车:28.7秒

  • SetCursorPosition:49.7秒

此外,SetCursorPosition引起了明显的闪烁,我没有观察到任何一种替代方案。因此,道德是尽可能使用退格或回车,并感谢教我一个更快的方法来做到这一点,所以!


更新:在评论中,Joel建议SetCursorPosition相对于移动的距离是恒定的,而其他方法是线性的。进一步的测试证实了这种情况,然而恒定的时间和缓慢仍然很慢。在我的测试中,将一长串退格写入控制台比SetCursorPosition更快,直到大约60个字符。因此,退格会更快地替换短于60个字符(或左右)的部分行,并且它不会闪烁,所以我将支持我最初认可的\ b over \ r \ n和SetCursorPosition


查看完整回答
反对 回复 2019-07-23
  • 3 回答
  • 0 关注
  • 908 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信