0

イベントログ付きのWPFアプリがあります。アプリの起動時にXMLファイルから保存されたイベントを入力するEventLogクラスがあります

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;
}

次に、これをリストビューがバインドされている監視可能なコレクションに変換します

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

私はこれがそれが行われなければならない方法であることを読みました(それは長い道のりのように見えますが)

アプリの実行中に、新しいイベントが監視可能なコレクションに追加されます。アプリが閉じたら、このプロセスを逆にしてイベントを保存します。

リストが大きくなるにつれて保存されたイベントが少ない場合、これは正常に機能しますが、これを行うのにかかる時間は非現実的です(240Kイベントには7秒かかります)。さて、あなたが尋ねるかもしれない最初の質問は、なぜ私はとにかくそんなに多くのイベントが欲しいのかということです、真実は私がそうしないということです、しかしそれは私がこれを最善の方法でやっていないことを強調しますか?

だから私の質問は:

本当に監視可能なコレクションにデータを入力する必要がありますか?_evtLogどちらか一方にデータを入力せずにObservableを作成することはできませんか?

イベントの日付に基づいて、これらのリストをXイベントに制限できますか?

4

3 に答える 3

2

の代わりに、GetSavedEventsシリアル化と逆シリアル化に簡単に変更できます。ObservableCollection<EventLog>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結果として結果を取得するクイックセレクトクエリを実行できますListObservableCollection

結果のフィルタリングに関するいくつかのアイデア

ニーズに応じて微調整が必​​要になる場合があります

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 に答える