C# 存储和输出字符串列表的最佳方式

标签 c# wpf mvvm

目前我的应用程序有一个文本框,可以在屏幕上显示 500 行实时日志记录。由于应用程序有很多繁重的任务在后面运行,所以我尽可能地为我的应用程序改进这部分。打开任何建议。谢谢。

WPF:

<TextBox Text="{Binding StatusMessage}" TextWrapping="Wrap" AcceptsReturn="True" />

方法一:

private void OutputMessage(string msg)
{
    //Result
    //1000  Lines     108ms
    //10000 Lines    1687ms
    if(!string.IsNullOrEmpty(msg))
    {
        string msgWithTimeStamp = System.DateTime.Now.ToString() + ": \t" + msg;

        int msgLine = 0;
        if (!string.IsNullOrEmpty(StatusMessage))
        {
            //Only show 500 lines of latest messages...
            msgLine = StatusMessage.Count(m => m == '\n');
            if (msgLine > 500)
                StatusMessage = StatusMessage.Remove(0, StatusMessage.IndexOf("\n") + 1);

            StatusMessage = StatusMessage + "\n" + msgWithTimeStamp;
        }
        else
            StatusMessage = msgWithTimeStamp;
    }
}

方法 2(更好的性能):

List<string> msgList;
private void OutputMessage(string msg)
{
    //Result
    //1000  Lines     31ms
    //10000 Lines    377ms
    if (!string.IsNullOrEmpty(msg))
    {
        string msgWithTimeStamp = System.DateTime.Now.ToString() + ": \t" + msg;
        msgList.Add(msgWithTimeStamp);

        if (msgList.Count > 500)
            msgList.RemoveAt(0);

        StatusMessage = String.Join("\n", msgList);
    }
}

最佳答案

您可以使用 ItemsControl 代替 TextBox,并将其 ItemsSource 数据绑定(bind)到 ObservableCollection。然后您只需将每条新消息附加到 ObservableCollection,ItemsControl 将自动更新以在其列表末尾显示新条目。

关于C# 存储和输出字符串列表的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54432630/

相关文章:

c# - 参数类型 'string' 无法分配给参数类型 'System.Collection.Generic.KeyValuePair<string,object>'

c# - 如何知道该电子邮件已发送,并且可以删除附件?

c# - 默认字体大小列表

c# - IEditableCollectionView 在 CommitEdit 上失去选择

c# - 通过 XAML 将图像设置为按钮背景

c# - Entity Framework 6 Create() 与 new

c# - 在哪里放置验证逻辑?在服务或存储库中?

c# - 编译 dll 以在其他语言中工作

wpf - 您可以在键入时替换文本框中的字符吗?

c# - 如何使用 MVVM 和 Xamarin.Forms ListView ItemSelected 事件来检索所选项目的绑定(bind)属性?