ログ ファイルの行を表示するプログラムがあります。
それらは解析され、LogLine というクラスに入れられ、データグリッドに表示されます。
これが私のフィルター関数です:
ICollectionView view = CollectionViewSource.GetDefaultView(this.LogView.ItemsSource);
bool traceChecked = this.TraceCheckbox.IsChecked.HasValue && this.TraceCheckbox.IsChecked.Value;
bool debugChecked = this.DebugCheckbox.IsChecked.HasValue && this.DebugCheckbox.IsChecked.Value;
bool infoChecked = this.InfoCheckbox.IsChecked.HasValue && this.InfoCheckbox.IsChecked.Value;
bool warnChecked = this.WarnCheckbox.IsChecked.HasValue && this.WarnCheckbox.IsChecked.Value;
bool errorChecked = this.ErrorCheckbox.IsChecked.HasValue && this.ErrorCheckbox.IsChecked.Value;
string filtertext = this.TextFilterBox.Text;
view.Filter = o =>
{
LogLine line = o as LogLine;
return line != null
&& (((traceChecked && line.Trace)
|| (debugChecked && line.Debug)
|| (infoChecked && line.Info)
|| (warnChecked && line.Warn)
|| (errorChecked && line.Error))
&& line.Message.Contains(filtertext));
};
この関数は既に遅く、200000 行のログで 5 秒近くかかります。
これをスピードアップするために何ができますか?
HighCore の提案に従って、実際の ViewModel を実装しました。これはわずかに高速ですが、ObservableCollection のすべての行をスローするのにまだ 5 ~ 6 秒かかります。
ICollectionView view = CollectionViewSource.GetDefaultView(this.LogView.ItemsSource);
LogViewModel lvm = (LogViewModel)this.DataContext;
view.Filter = o =>
{
LogLine line = o as LogLine;
if (line == null || !line.Message.Contains(lvm.FilterText))
{
return false;
}
switch (line.LogLevel)
{
case LogViewModel.LogLevel.Trace:
return lvm.Trace;
case LogViewModel.LogLevel.Debug:
return lvm.Debug;
case LogViewModel.LogLevel.Info:
return lvm.Info;
case LogViewModel.LogLevel.Warn:
return lvm.Warn;
case LogViewModel.LogLevel.Error:
return lvm.Error;
default:
return false;
}
};