How to modify the previous line of console text?
You can move cursor wherever you want: Console.SetCursorPosition or use Console.CursorTop.
Console.SetCursorPosition(0, Console.CursorTop -1);Console.WriteLine("Over previous line!!!");
Use a carriage return. This sample prints a single line, overwriting what was there before.
Console.WriteLine(); for (int i = 0; i <= 100; i++) { System.Threading.Thread.Sleep(10); Console.Write("\x000DProgress: " + i); }
This works as long as all your strings are less than 80 columns (or whatever your terminal buffer is set to).
Note: the following answer was originally edited into the question by the OP.
Here's complete solution with demo:
using System;using System.Collections.Generic;using System.Threading;namespace PowerConsole { internal class Containers { internal struct Container { public int Id; public int X; public int Y; public string Content; } public static List<Container> Items = new List<Container>(); private static int Identity = 0; public static int Add(string text) { var c = new Container(); c.Id = Identity++; c.X = Console.CursorLeft; c.Y = Console.CursorTop; c.Content = text; Console.Write(text); Items.Add(c); return c.Id; } public static void Remove(int id) { Items.RemoveAt(id); } public static void Replace(int id, string text) { int x = Console.CursorLeft, y = Console.CursorTop; Container c = Items[id]; Console.MoveBufferArea( c.X + c.Content.Length, c.Y, Console.BufferWidth - c.X - text.Length, 1, c.X + text.Length, c.Y ); Console.CursorLeft = c.X; Console.CursorTop = c.Y; Console.Write(text); c.Content = text; Console.CursorLeft = x; Console.CursorTop = y; } public static void Clear() { Items.Clear(); Identity = 0; } } internal class Program { private static List<Thread> Threads = new List<Thread>(); private static void Main(string[] args) { Console.WriteLine("So we have some threads:\r\n"); int i, id; Random r = new Random(); for (i = 0; i < 10; i++) { Console.Write("Starting thread " + i + "...["); id = Containers.Add("?"); Console.WriteLine("]"); Thread t = new Thread((object data) => { Thread.Sleep(r.Next(5000) + 100); Console.ForegroundColor = ConsoleColor.Green; Containers.Replace((int)data, "DONE"); Console.ResetColor(); }); Threads.Add(t); } Console.WriteLine("\n\"But will it blend?\"..."); Console.ReadKey(true); i = 0; Threads.ForEach(t => t.Start(i++)); Threads.ForEach(t => t.Join()); Console.WriteLine("\r\nVoila."); Console.ReadKey(true); } }}