C# 是否有方法连续镜像Console.Write的结果到集合(数组、列表等)?

C# 是否有方法连续镜像Console.Write的结果到集合(数组、列表等)?,c#,.net,visual-studio,.net-4.0,c#-4.0,C#,.net,Visual Studio,.net 4.0,C# 4.0,我有一个控制台程序,我想不断地镜像控制台的结果。写一个集合,我可以实时查看它的尾部。集合可以是数组、列表等 我想我必须使用某种事件处理程序 我不介意被指向第三方库,例如NLog 更新 我需要在内存中维护一个集合,该集合反映当前控制台状态(然后我可以使用套接字发送到远程WinForms应用程序)。撇开细节不谈,我想我可以用几行C来做到这一点——我不想在不需要它的情况下添加一个巨大的日志库。使用log4net在文件中连续转储,然后使用它作为尾部:您可以创建一个简单的助手方法并调用它,而不是Conso

我有一个控制台程序,我想不断地镜像控制台的结果。写一个集合,我可以实时查看它的尾部。集合可以是数组、列表等

我想我必须使用某种事件处理程序

我不介意被指向第三方库,例如NLog

更新


我需要在内存中维护一个集合,该集合反映当前控制台状态(然后我可以使用套接字发送到远程WinForms应用程序)。撇开细节不谈,我想我可以用几行C来做到这一点——我不想在不需要它的情况下添加一个巨大的日志库。

使用log4net在文件中连续转储,然后使用它作为尾部:

您可以创建一个简单的助手方法并调用它,而不是Console.Write

private void WriteToConsole(string message)
{
    myList.Add(message);

    Console.Write(message);
}

您可能可以编写一个新的
TextWriter
谁的
write
调用来填充列表,而不是写入流。然后需要通过控制台进行设置。使用设置(…)

可以设置自定义实现的TextWriter。

控制台类允许您替换输出和错误流。正如您在这里所需要的,您可以用一个也记录所写内容的TextWriter来代替它们。示例实现:

    class ConsoleLogger : System.IO.TextWriter {
        private System.IO.TextWriter oldOut;
        private Queue<string> log = new Queue<string>();
        private StringBuilder line = new StringBuilder();
        private object locker = new object();
        private int newline;
        private int logmax;

        public ConsoleLogger(int history) {
            logmax = history;
            oldOut = Console.Out;
            Console.SetOut(this);
        }
        public override Encoding Encoding {
            get { return oldOut.Encoding; }
        }
        public override void Write(char value) {
            oldOut.Write(value);
            lock (locker) {
                if (value == '\r') newline++;
                else if (value == '\n') {
                    log.Enqueue(line.ToString());
                    if (log.Count > logmax) log.Dequeue();
                    line.Length = newline = 0;
                }
                else {
                    for (; newline > 0; newline--) line.Append('\r');
                    line.Append(value);
                }
            }
        }
    }

如果您想编写如下代码:

    WriteToConsole("{0} tel is: {1:+### ### ### ###}", "Name", 242352356578);
然后,您可以使用以下代码:

    private static Queue<String> q = new Queue<String>(1000);
    private static void WriteToConsole(String message)
    {
        q.Enqueue(message);
        Console.Write(message);
    }
    private static void WriteToConsole(String message, params Object[] r)
    {
        String s = String.Format(message, r);
        q.Enqueue(s);
        Console.Write(s);
    }
私有静态队列q=新队列(1000);
私有静态void writeConsole(字符串消息)
{
q、 排队(消息);
控制台。写入(消息);
}
私有静态void writeConsole(字符串消息,参数对象[]r)
{
String s=String.Format(消息,r);
q、 排队;;
控制台。写入;
}

请参见。

好的,这是可行的。但是,我不想更改现有的console应用程序,当console.Write()有多个参数时,这将产生问题。
    private static Queue<String> q = new Queue<String>(1000);
    private static void WriteToConsole(String message)
    {
        q.Enqueue(message);
        Console.Write(message);
    }
    private static void WriteToConsole(String message, params Object[] r)
    {
        String s = String.Format(message, r);
        q.Enqueue(s);
        Console.Write(s);
    }