到目前为止,对于如何做到这一点,我们有三个相互竞争的替代方案:
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 引起了明显的闪烁,这是我在使用任何一种替代方案时都没有观察到的。所以,道德是尽可能使用退格或回车,并且感谢教我更快的方法,所以!
更新:在 cmets 中,Joel 建议 SetCursorPosition 相对于移动的距离是恒定的,而其他方法是线性的。进一步的测试证实确实如此,然而恒定时间和缓慢仍然很慢。在我的测试中,将一长串退格键写入控制台比 SetCursorPosition 快,直到大约 60 个字符。因此,退格可以更快地替换短于 60 个字符(或更多)的行的部分,并且它不会闪烁,所以我将坚持我最初对 \b 而不是 \r 的认可和SetCursorPosition。