Jusqu'à présent, nous disposons de trois solutions concurrentes pour y parvenir :
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
}
J'ai toujours utilisé Console.CursorLeft = 0
une variation de la troisième option, j'ai donc décidé de faire quelques tests. Voici le code que j'ai utilisé :
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);
}
Sur ma machine, j'obtiens les résultats suivants :
- Backspaces : 25.0 secondes
- Retour de chariot : 28,7 secondes
- SetCursorPosition : 49,7 secondes
En outre, SetCursorPosition
a causé un scintillement perceptible que je n'ai pas observé avec l'une ou l'autre des alternatives. Donc, la morale est de utilisez des retours arrière ou des retours de chariot lorsque cela est possible y merci de m'avoir appris un moyen plus rapide de le faire, SO !
Mise à jour : Dans les commentaires, Joel suggère que SetCursorPosition est constant par rapport à la distance déplacée alors que les autres méthodes sont linéaires. Des tests supplémentaires confirment que c'est le cas, cependant temps constant et lent est toujours lent. Dans mes tests, écrire une longue chaîne de retours arrière dans la console est plus rapide que SetCursorPosition jusqu'à environ 60 caractères. Ainsi, l'espacement arrière est plus rapide pour remplacer les portions de ligne plus courtes que 60 caractères (environ), y il ne scintille pas, donc je vais rester sur mon approbation initiale de \b sur \r y SetCursorPosition
.
1 votes
Si vous êtes VRAIMENT intéressé par les interfaces de ligne de commande, vous devriez consulter curses/ncurses.
0 votes
@CharlesAddis mais curses/ncurses ne fonctionne-t-il pas uniquement en C++ ?
3 votes
@Xam Alors que je travaillais sur la programmation multiplateforme dans .NET Core, j'ai choisi par hasard la bibliothèque curses comme exemple à mettre en œuvre. Le paquet est dotnet-curses .