0

我有一个带有事件日志的 WPF 应用程序。我有一个 EventLog 类,当应用程序启动时,我使用 XML 文件中保存的事件填充

namespace MyApp.Agent.EventLogging
{
    public enum EventType
    {
        Infomation,
        Error
    }
    public class EventLog
    {
        public String Image { get; set; }
        public DateTime EventDate { get; set; }
        public String EventText { get; set; }
    }
}

public List<EventLog> GetSavedEvents()
{
   string file = XmlUtilities.GetXmlLocation() + "\\Events.xml";
   List<EventLog> elog = new List<EventLog>();
   try
   {
       if (File.Exists(file))
       {
          Serialize<List<EventLog>> ser = new Serialize<List<EventLog>>();
          elog = ser.DeserializeDocToObj(file);
       }
   }
   catch
   {
          throw new InvalidEventLogException(ConfigurationManager.AppSettings.Get("EventLogFileInvalid"));
   }
 return elog;
}

然后,我将其转换为 listview 绑定到的可观察集合

List<EventLog> _evtLog = new List<EventLog>();
ObservableCollection<EventLog> _eventLog = new ObservableCollection<EventLog>();
_evtLog = logger.GetSavedEvents();
_evtLog.ForEach(x => _eventLog.Add(x));

我读到这就是它必须完成的方式(尽管这似乎是一个冗长的方式)

当应用程序运行时,新事件被添加到 observable 集合中。当应用程序关闭时,我会反转此过程以保存事件。

虽然如果随着列表越来越大而只有少数已保存的事件,这可以正常工作,但执行此操作所需的时间变得不切实际(240K 事件需要 7 秒)。好的,您可能会问的第一个问题是,为什么我仍然想要这么多活动,事实是我不想要,但它确实强调了我不是以最好的方式做到这一点?

所以我的问题是:

我真的需要填充可观察的集合吗?我不能在_evtLog不填充另一个的情况下制作 Observable 吗?

我可以根据事件的日期将这些列表限制为 X 事件吗?

4

3 回答 3

2

您可以轻松更改GetSavedEvents为序列化和反序列化ObservableCollection<EventLog>a 而不是List<EventLog>.

话虽如此,将列表转换为可观察集合的代码看起来很奇怪。你为什么不只是使用适当的构造函数?

_eventLog = new ObservableCollection<EventLog>(logger.GetSavedEvents());

使用的问题Add是,对于每个要添加的项目,您都会引发一个事件。

于 2012-10-18T10:35:52.423 回答
2

以下将创建ObservableCollection

var _eventLog = new ObservableCollection<EventLog>(logger.GetSavedEvents());

关于过滤结果,是的,您可以进行快速LINQ选择查询,在其中定义限制并将结果作为List您将传递给的结果ObservableCollection

关于过滤结果的一些想法

您可能需要根据您的需要进行一些调整

var _eventLog = new ObservableCollection<EventLog>(logger.GetSavedEvents().where(event => event.date == some date).ToList());
于 2012-10-18T10:36:54.293 回答
0

这是生成 ObservableCollection 的实际代码吗?从 240k 元素列表生成 OC 不应该花费 7 秒,它应该几乎是瞬时的。

您确定没有将事件添加到已经绑定到列表视图的集合中,从而导致列表视图为每个项目更新吗?

尝试使用它而不是 ObservableCollection:

class MyObservableCollection<T> : ObservableCollection<T>
{
    private bool _notifyCollectionChanged = true;

    protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    {
        if (_notifyCollectionChanged)
            base.OnCollectionChanged(e);
    }

    public void AddRange(IEnumerable<T> collection)
    {
        _notifyCollectionChanged = false;
        foreach (T element in collection)
            Add(element);
        _notifyCollectionChanged = true;
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }
}

并使用 oc.AddRange(list) 将列表添加到 ObservableCollection。

如果这没有帮助,那么您的 GetSavedEvents 函数可能会运行 7 秒,它与 ObservableCollection 无关。

于 2012-10-18T10:55:00.310 回答