From 2ba7da7b18206f7e94c493605f2816a7c46dc8b7 Mon Sep 17 00:00:00 2001 From: jschick04 Date: Mon, 2 Dec 2024 11:20:04 -0600 Subject: [PATCH] Added a few more performance optimizations --- .../DbToolCommand.cs | 6 +-- .../EventResolvers/EventResolverTests.cs | 4 +- .../EventResolvers/EventResolverBase.cs | 44 ++++++++++++------- .../Helpers/EventMethods.cs | 2 +- .../Providers/EventMessageProvider.cs | 10 ++--- .../Providers/ProviderDetails.cs | 12 ++--- src/EventLogExpert.UI/FilterMethods.cs | 11 +++-- .../Interfaces/IPreferencesProvider.cs | 10 ++--- .../Store/EventLog/EventLogAction.cs | 5 +-- .../Store/EventLog/EventLogEffects.cs | 19 ++++---- .../Store/EventLog/EventLogReducers.cs | 4 +- .../Store/EventTable/EventTableEffects.cs | 6 +-- .../Store/EventTable/EventTableReducers.cs | 16 ++----- .../Store/LoggingMiddleware.cs | 2 +- .../Store/Settings/SettingsAction.cs | 6 +-- .../Services/PreferencesProvider.cs | 13 +++--- 16 files changed, 88 insertions(+), 82 deletions(-) diff --git a/src/EventLogExpert.EventDbTool/DbToolCommand.cs b/src/EventLogExpert.EventDbTool/DbToolCommand.cs index a7315529..86f84e8d 100644 --- a/src/EventLogExpert.EventDbTool/DbToolCommand.cs +++ b/src/EventLogExpert.EventDbTool/DbToolCommand.cs @@ -37,11 +37,11 @@ public static void LogProviderDetails(ProviderDetails details) Console.WriteLine( s_providerDetailFormat, details.ProviderName, - details.Events.Count, - details.Parameters.Count, + details.Events.Count(), + details.Parameters.Count(), details.Keywords.Count, details.Opcodes.Count, details.Tasks.Count, - details.Messages.Count); + details.Messages.Count()); } } diff --git a/src/EventLogExpert.Eventing.Tests/EventResolvers/EventResolverTests.cs b/src/EventLogExpert.Eventing.Tests/EventResolvers/EventResolverTests.cs index f05502fa..916f48df 100644 --- a/src/EventLogExpert.Eventing.Tests/EventResolvers/EventResolverTests.cs +++ b/src/EventLogExpert.Eventing.Tests/EventResolvers/EventResolverTests.cs @@ -52,7 +52,7 @@ public void EventResolver_MSExchangeReplId4114_ShouldResolve() var providerDetails = new ProviderDetails { Events = [], - Keywords = [], + Keywords = new Dictionary(), Messages = [ new MessageModel @@ -66,7 +66,7 @@ public void EventResolver_MSExchangeReplId4114_ShouldResolve() Text = "Database redundancy health check passed.%nDatabase copy: %1%nRedundancy count: %2%nIsSuppressed: %4%n%nErrors:%n%3\r\n" } ], - Opcodes = [], + Opcodes = new Dictionary(), ProviderName = "MSExchangeRepl", Tasks = new Dictionary { diff --git a/src/EventLogExpert.Eventing/EventResolvers/EventResolverBase.cs b/src/EventLogExpert.Eventing/EventResolvers/EventResolverBase.cs index 9ca6e687..a3b6ed2e 100644 --- a/src/EventLogExpert.Eventing/EventResolvers/EventResolverBase.cs +++ b/src/EventLogExpert.Eventing/EventResolvers/EventResolverBase.cs @@ -8,7 +8,6 @@ using System.Collections.Concurrent; using System.Security.Principal; using System.Text.RegularExpressions; -using System.Xml.Linq; namespace EventLogExpert.Eventing.EventResolvers; @@ -77,7 +76,7 @@ public DisplayEventModel ResolveEvent(EventRecord eventRecord) => Xml = eventRecord.Xml ?? string.Empty }; - private static ReadOnlySpan CleanupFormatting(string unformattedString) + private static string CleanupFormatting(ReadOnlySpan unformattedString) { Span buffer = stackalloc char[unformattedString.Length * 2]; int bufferIndex = 0; @@ -136,24 +135,38 @@ private static ReadOnlySpan CleanupFormatting(string unformattedString) } } - return new ReadOnlySpan(buffer[..bufferIndex].ToArray()); + return new string(buffer[..bufferIndex]); } - private static List GetFormattedProperties(string? template, IEnumerable properties) + private static List GetFormattedProperties(ReadOnlySpan template, IEnumerable properties) { string[]? dataNodes = null; List providers = []; - if (!string.IsNullOrEmpty(template) && !s_formattedPropertiesCache.TryGetValue(template, out dataNodes)) + var cache = s_formattedPropertiesCache.GetAlternateLookup>(); + + if (!template.IsEmpty && !cache.TryGetValue(template, out dataNodes)) { - dataNodes = XElement.Parse(template) - .Descendants() - .Attributes() - .Where(a => a.Name == "outType") - .Select(a => a.Value) - .ToArray(); - - s_formattedPropertiesCache.TryAdd(template, dataNodes); + List temp = []; + ReadOnlySpan outTypeAttribute = "outType=\""; + + foreach (var line in template.EnumerateLines()) + { + int templateIndex = line.IndexOf(outTypeAttribute, StringComparison.Ordinal); + + if (templateIndex == -1) { continue; } + + templateIndex += outTypeAttribute.Length; + int endIndex = line[templateIndex..].IndexOf('"'); + + if (endIndex != -1) + { + temp.Add(new string(line.Slice(templateIndex, endIndex))); + } + } + + dataNodes = [.. temp]; + cache.TryAdd(template, dataNodes); } int index = 0; @@ -240,10 +253,9 @@ private static void ResizeBuffer(ref char[] buffer, ref Span source, int s private string FormatDescription( List properties, string? descriptionTemplate, - List parameters) + IEnumerable parameters) { string returnDescription; - if (string.IsNullOrWhiteSpace(descriptionTemplate)) { // If there is only one property then this is what certain EventRecords look like @@ -297,7 +309,7 @@ private string FormatDescription( propString = properties[propIndex - 1]; } - if (propString.StartsWith("%%") && parameters.Count > 0) + if (propString.StartsWith("%%") && parameters.Any()) { int endParameterId = propString.IndexOf(' '); var parameterIdString = endParameterId > 2 ? propString.Slice(2, endParameterId) : propString[2..]; diff --git a/src/EventLogExpert.Eventing/Helpers/EventMethods.cs b/src/EventLogExpert.Eventing/Helpers/EventMethods.cs index d33873f0..967a2435 100644 --- a/src/EventLogExpert.Eventing/Helpers/EventMethods.cs +++ b/src/EventLogExpert.Eventing/Helpers/EventMethods.cs @@ -194,7 +194,7 @@ internal static partial class EventMethods case (int)EvtVariantType.Null: return null; case (int)EvtVariantType.String: - return Marshal.PtrToStringAuto(variant.StringVal); + return Marshal.PtrToStringUni(variant.StringVal); case (int)EvtVariantType.AnsiString: return Marshal.PtrToStringAnsi(variant.AnsiString); case (int)EvtVariantType.SByte: diff --git a/src/EventLogExpert.Eventing/Providers/EventMessageProvider.cs b/src/EventLogExpert.Eventing/Providers/EventMessageProvider.cs index 44e3ea82..5b9831a2 100644 --- a/src/EventLogExpert.Eventing/Providers/EventMessageProvider.cs +++ b/src/EventLogExpert.Eventing/Providers/EventMessageProvider.cs @@ -209,7 +209,7 @@ private ProviderDetails LoadMessagesFromModernProvider(ProviderMetadata provider Task = e.Task, Template = e.Template, Version = e.Version - }).ToList(); + }).ToArray(); } catch (Exception ex) { @@ -218,7 +218,7 @@ private ProviderDetails LoadMessagesFromModernProvider(ProviderMetadata provider try { - provider.Keywords = new Dictionary(providerMetadata.Keywords); + provider.Keywords = providerMetadata.Keywords; } catch (Exception ex) @@ -228,7 +228,7 @@ private ProviderDetails LoadMessagesFromModernProvider(ProviderMetadata provider try { - provider.Opcodes = new Dictionary(providerMetadata.Opcodes); + provider.Opcodes = providerMetadata.Opcodes; } catch (Exception ex) { @@ -237,14 +237,14 @@ private ProviderDetails LoadMessagesFromModernProvider(ProviderMetadata provider try { - provider.Tasks = new Dictionary(providerMetadata.Tasks); + provider.Tasks = providerMetadata.Tasks; } catch (Exception ex) { _logger?.Trace($"Failed to load Tasks for modern provider: {_providerName}. Exception:\n{ex}"); } - _logger?.Trace($"Returning {provider.Events.Count} events for provider {_providerName}"); + _logger?.Trace($"Returning {provider.Events.Count()} events for provider {_providerName}"); return provider; } diff --git a/src/EventLogExpert.Eventing/Providers/ProviderDetails.cs b/src/EventLogExpert.Eventing/Providers/ProviderDetails.cs index 86971140..e0e4f35e 100644 --- a/src/EventLogExpert.Eventing/Providers/ProviderDetails.cs +++ b/src/EventLogExpert.Eventing/Providers/ProviderDetails.cs @@ -10,17 +10,17 @@ public class ProviderDetails public string ProviderName { get; set; } = string.Empty; /// Messages from legacy provider - public List Messages { get; set; } = []; + public IEnumerable Messages { get; set; } = []; /// Parameter strings from legacy provider - public List Parameters { get; set; } = []; + public IEnumerable Parameters { get; set; } = []; /// Events and related items from modern provider - public List Events { get; set; } = []; + public IEnumerable Events { get; set; } = []; - public Dictionary Keywords { get; set; } = []; + public IDictionary Keywords { get; set; } = new Dictionary(); - public Dictionary Opcodes { get; set; } = []; + public IDictionary Opcodes { get; set; } = new Dictionary(); - public Dictionary Tasks { get; set; } = []; + public IDictionary Tasks { get; set; } = new Dictionary(); } diff --git a/src/EventLogExpert.UI/FilterMethods.cs b/src/EventLogExpert.UI/FilterMethods.cs index 7c813207..fc4df8bb 100644 --- a/src/EventLogExpert.UI/FilterMethods.cs +++ b/src/EventLogExpert.UI/FilterMethods.cs @@ -3,6 +3,7 @@ using EventLogExpert.Eventing.Models; using EventLogExpert.UI.Models; +using System.Collections.ObjectModel; namespace EventLogExpert.UI; @@ -81,11 +82,12 @@ public static bool IsFilteringEnabled(EventFilter eventFilter) => eventFilter.Filters.IsEmpty is false; /// Sorts events by RecordId if no order is specified - public static IEnumerable SortEvents( + public static ReadOnlyCollection SortEvents( this IEnumerable events, ColumnName? orderBy = null, - bool isDescending = false) => - orderBy switch + bool isDescending = false) + { + var sortedEvents = orderBy switch { ColumnName.Level => isDescending ? events.OrderByDescending(e => e.Level) : events.OrderBy(e => e.Level), ColumnName.DateAndTime => isDescending ? @@ -115,4 +117,7 @@ public static IEnumerable SortEvents( ColumnName.User => isDescending ? events.OrderByDescending(e => e.UserId) : events.OrderBy(e => e.UserId), _ => isDescending ? events.OrderByDescending(e => e.RecordId) : events.OrderBy(e => e.RecordId) }; + + return sortedEvents.ToList().AsReadOnly(); + } } diff --git a/src/EventLogExpert.UI/Interfaces/IPreferencesProvider.cs b/src/EventLogExpert.UI/Interfaces/IPreferencesProvider.cs index c7732e5a..24beb3af 100644 --- a/src/EventLogExpert.UI/Interfaces/IPreferencesProvider.cs +++ b/src/EventLogExpert.UI/Interfaces/IPreferencesProvider.cs @@ -8,13 +8,13 @@ namespace EventLogExpert.UI.Interfaces; public interface IPreferencesProvider { - IList DisabledDatabasesPreference { get; set; } + IEnumerable DisabledDatabasesPreference { get; set; } bool DisplayPaneSelectionPreference { get; set; } - IList EnabledEventTableColumnsPreference { get; set; } + IEnumerable EnabledEventTableColumnsPreference { get; set; } - IList FavoriteFiltersPreference { get; set; } + IEnumerable FavoriteFiltersPreference { get; set; } CopyType KeyboardCopyTypePreference { get; set; } @@ -22,9 +22,9 @@ public interface IPreferencesProvider bool PreReleasePreference { get; set; } - IList RecentFiltersPreference { get; set; } + IEnumerable RecentFiltersPreference { get; set; } - IList SavedFiltersPreference { get; set; } + IEnumerable SavedFiltersPreference { get; set; } string TimeZonePreference { get; set; } } diff --git a/src/EventLogExpert.UI/Store/EventLog/EventLogAction.cs b/src/EventLogExpert.UI/Store/EventLog/EventLogAction.cs index 0ce3a7ae..f3c49eec 100644 --- a/src/EventLogExpert.UI/Store/EventLog/EventLogAction.cs +++ b/src/EventLogExpert.UI/Store/EventLog/EventLogAction.cs @@ -5,7 +5,6 @@ using EventLogExpert.Eventing.Models; using EventLogExpert.UI.Models; using System.Collections.Immutable; -using System.Collections.ObjectModel; namespace EventLogExpert.UI.Store.EventLog; @@ -13,7 +12,7 @@ public sealed record EventLogAction { public sealed record AddEvent(DisplayEventModel NewEvent); - public sealed record AddEventBuffered(ReadOnlyCollection UpdatedBuffer, bool IsFull); + public sealed record AddEventBuffered(IEnumerable UpdatedBuffer, bool IsFull); public sealed record AddEventSuccess(ImmutableDictionary ActiveLogs); @@ -21,7 +20,7 @@ public sealed record CloseAll; public sealed record CloseLog(EventLogId LogId, string LogName); - public sealed record LoadEvents(EventLogData LogData, ReadOnlyCollection Events); + public sealed record LoadEvents(EventLogData LogData, IEnumerable Events); public sealed record LoadNewEvents; diff --git a/src/EventLogExpert.UI/Store/EventLog/EventLogEffects.cs b/src/EventLogExpert.UI/Store/EventLog/EventLogEffects.cs index 5d0aa3c9..5df68268 100644 --- a/src/EventLogExpert.UI/Store/EventLog/EventLogEffects.cs +++ b/src/EventLogExpert.UI/Store/EventLog/EventLogEffects.cs @@ -57,8 +57,8 @@ public Task HandleAddEvent(EventLogAction.AddEvent action, IDispatcher dispatche } else { - var updatedBuffer = newEvent.Concat(_eventLogState.Value.NewEventBuffer).ToList().AsReadOnly(); - var full = updatedBuffer.Count >= EventLogState.MaxNewEvents; + var updatedBuffer = newEvent.Concat(_eventLogState.Value.NewEventBuffer); + var full = updatedBuffer.Count() >= EventLogState.MaxNewEvents; dispatcher.Dispatch(new EventLogAction.AddEventBuffered(updatedBuffer, full)); } @@ -197,7 +197,7 @@ await Parallel.ForEachAsync( dispatcher.Dispatch( new EventLogAction.LoadEvents( logData, - events.OrderByDescending(e => e.RecordId).ToList().AsReadOnly())); + events.OrderByDescending(e => e.RecordId))); dispatcher.Dispatch(new StatusBarAction.SetEventsLoading(activityId, 0, 0)); @@ -233,12 +233,9 @@ public Task HandleSetFilters(EventLogAction.SetFilters action, IDispatcher dispa /// Adds new events to the currently opened log private static EventLogData AddEventsToOneLog(EventLogData logData, IEnumerable eventsToAdd) { - var newEvents = eventsToAdd - .Concat(logData.Events) - .ToList() - .AsReadOnly(); + var newEvents = eventsToAdd.Concat(logData.Events); - var updatedLogData = logData with { Events = newEvents }; + var updatedLogData = logData with { Events = newEvents.ToList().AsReadOnly() }; return updatedLogData; } @@ -248,13 +245,13 @@ private static ImmutableDictionary DistributeEventsToManyL IEnumerable eventsToDistribute) { var newLogs = logsToUpdate; - var events = eventsToDistribute.ToList(); + var events = eventsToDistribute; foreach (var log in logsToUpdate.Values) { - var newEventsForThisLog = events.Where(e => e.OwningLog == log.Name).ToList(); + var newEventsForThisLog = events.Where(e => e.OwningLog == log.Name); - if (newEventsForThisLog.Count <= 0) { continue; } + if (newEventsForThisLog.Any()) { continue; } var newLogData = AddEventsToOneLog(log, newEventsForThisLog); newLogs = newLogs.Remove(log.Name).Add(log.Name, newLogData); diff --git a/src/EventLogExpert.UI/Store/EventLog/EventLogReducers.cs b/src/EventLogExpert.UI/Store/EventLog/EventLogReducers.cs index 05f42839..793ceb3e 100644 --- a/src/EventLogExpert.UI/Store/EventLog/EventLogReducers.cs +++ b/src/EventLogExpert.UI/Store/EventLog/EventLogReducers.cs @@ -13,7 +13,7 @@ public sealed class EventLogReducers { [ReducerMethod] public static EventLogState ReduceAddEventBuffered(EventLogState state, EventLogAction.AddEventBuffered action) => - state with { NewEventBuffer = action.UpdatedBuffer, NewEventBufferIsFull = action.IsFull }; + state with { NewEventBuffer = action.UpdatedBuffer.ToList().AsReadOnly(), NewEventBufferIsFull = action.IsFull }; [ReducerMethod] public static EventLogState ReduceAddEventSuccess(EventLogState state, EventLogAction.AddEventSuccess action) => @@ -54,7 +54,7 @@ public static EventLogState ReduceLoadEvents(EventLogState state, EventLogAction { ActiveLogs = newLogsCollection.Add( action.LogData.Name, - action.LogData with { Events = action.Events }) + action.LogData with { Events = action.Events.ToList().AsReadOnly() }) }; } diff --git a/src/EventLogExpert.UI/Store/EventTable/EventTableEffects.cs b/src/EventLogExpert.UI/Store/EventTable/EventTableEffects.cs index 44fa18d9..3212b5ed 100644 --- a/src/EventLogExpert.UI/Store/EventTable/EventTableEffects.cs +++ b/src/EventLogExpert.UI/Store/EventTable/EventTableEffects.cs @@ -32,7 +32,7 @@ public Task HandleLoadColumns(IDispatcher dispatcher) var columns = new Dictionary(); var enabledColumns = _preferencesProvider.EnabledEventTableColumnsPreference; - foreach (ColumnName column in Enum.GetValues(typeof(ColumnName))) + foreach (ColumnName column in Enum.GetValues()) { columns.Add(column, enabledColumns.Contains(column)); } @@ -48,7 +48,7 @@ public Task HandleToggleColumn(EventTableAction.ToggleColumn action, IDispatcher var columns = new Dictionary(); var enabledColumns = _preferencesProvider.EnabledEventTableColumnsPreference; - foreach (ColumnName column in Enum.GetValues(typeof(ColumnName))) + foreach (ColumnName column in Enum.GetValues()) { columns.Add(column, column.Equals(action.ColumnName) ? @@ -56,7 +56,7 @@ public Task HandleToggleColumn(EventTableAction.ToggleColumn action, IDispatcher enabledColumns.Contains(column)); } - _preferencesProvider.EnabledEventTableColumnsPreference = columns.Keys.Where(column => columns[column]).ToList(); + _preferencesProvider.EnabledEventTableColumnsPreference = columns.Keys.Where(column => columns[column]); dispatcher.Dispatch(new EventTableAction.LoadColumnsCompleted(columns)); diff --git a/src/EventLogExpert.UI/Store/EventTable/EventTableReducers.cs b/src/EventLogExpert.UI/Store/EventTable/EventTableReducers.cs index cb9f53e9..34ff26d3 100644 --- a/src/EventLogExpert.UI/Store/EventTable/EventTableReducers.cs +++ b/src/EventLogExpert.UI/Store/EventTable/EventTableReducers.cs @@ -6,6 +6,7 @@ using EventLogExpert.UI.Models; using Fluxor; using System.Collections.Immutable; +using System.Collections.ObjectModel; namespace EventLogExpert.UI.Store.EventTable; @@ -75,8 +76,6 @@ public static EventTableState ReduceCloseLog(EventTableState state, EventTableAc IsCombined = true, DisplayedEvents = GetCombinedEvents(updatedTables.Select(log => log.DisplayedEvents)) .SortEvents(state.OrderBy ?? ColumnName.DateAndTime, state.IsDescending) - .ToList() - .AsReadOnly() }; return state with @@ -153,8 +152,6 @@ public static EventTableState ReduceUpdateCombinedEvents(EventTableState state) .Where(table => !table.IsCombined) .Select(table => table.DisplayedEvents)) .SortEvents(state.OrderBy ?? ColumnName.DateAndTime, state.IsDescending) - .ToList() - .AsReadOnly() }) }; } @@ -180,8 +177,6 @@ public static EventTableState ReduceUpdateDisplayedEvents( updatedTables.Add(table with { DisplayedEvents = currentActiveLog.SortEvents(state.OrderBy, state.IsDescending) - .ToList() - .AsReadOnly() }); } @@ -197,14 +192,13 @@ public static EventTableState ReduceUpdateTable(EventTableState state, EventTabl { EventTables = state.EventTables.Remove(table).Add(table with { - DisplayedEvents = action.Events.SortEvents(state.OrderBy, state.IsDescending).ToList() - .AsReadOnly(), + DisplayedEvents = action.Events.SortEvents(state.OrderBy, state.IsDescending), IsLoading = false }) }; } - private static IEnumerable GetCombinedEvents( + private static ReadOnlyCollection GetCombinedEvents( IEnumerable> eventLists) { List combinedEvents = []; @@ -214,7 +208,7 @@ private static IEnumerable GetCombinedEvents( combinedEvents.AddRange(eventList); } - return combinedEvents; + return combinedEvents.AsReadOnly(); } private static EventTableState SortDisplayEvents(EventTableState state, ColumnName? orderBy, bool isDescending) @@ -226,8 +220,6 @@ private static EventTableState SortDisplayEvents(EventTableState state, ColumnNa logData => logData with { DisplayedEvents = logData.DisplayedEvents.SortEvents(orderBy, isDescending) - .ToList() - .AsReadOnly() })); return state with diff --git a/src/EventLogExpert.UI/Store/LoggingMiddleware.cs b/src/EventLogExpert.UI/Store/LoggingMiddleware.cs index dcb00ad4..d0af1307 100644 --- a/src/EventLogExpert.UI/Store/LoggingMiddleware.cs +++ b/src/EventLogExpert.UI/Store/LoggingMiddleware.cs @@ -28,7 +28,7 @@ public override void BeforeDispatch(object action) switch (action) { case EventLogAction.LoadEvents loadEventsAction: - _debugLogger.Trace($"Action: {action.GetType()} with {loadEventsAction.Events.Count} events."); + _debugLogger.Trace($"Action: {action.GetType()} with {loadEventsAction.Events.Count()} events."); break; case EventLogAction.AddEvent addEventsAction: _debugLogger.Trace($"Action: {action.GetType()} with {addEventsAction.NewEvent.Source} event ID {addEventsAction.NewEvent.Id}."); diff --git a/src/EventLogExpert.UI/Store/Settings/SettingsAction.cs b/src/EventLogExpert.UI/Store/Settings/SettingsAction.cs index 06ac4d6a..f76915af 100644 --- a/src/EventLogExpert.UI/Store/Settings/SettingsAction.cs +++ b/src/EventLogExpert.UI/Store/Settings/SettingsAction.cs @@ -13,7 +13,7 @@ public sealed record LoadDatabasesCompleted(IEnumerable LoadedDatabases) public sealed record LoadSettings; - public sealed record LoadSettingsCompleted(SettingsModel Config, IList DisabledDatabases); + public sealed record LoadSettingsCompleted(SettingsModel Config, IEnumerable DisabledDatabases); public sealed record OpenDebugLog; @@ -23,7 +23,7 @@ public sealed record Save(SettingsModel Settings); public sealed record SaveCompleted(SettingsModel Settings); - public sealed record SaveDisabledDatabases(IList Databases); + public sealed record SaveDisabledDatabases(IEnumerable Databases); - public sealed record SaveDisabledDatabasesCompleted(IList Databases); + public sealed record SaveDisabledDatabasesCompleted(IEnumerable Databases); } diff --git a/src/EventLogExpert/Services/PreferencesProvider.cs b/src/EventLogExpert/Services/PreferencesProvider.cs index 91c84d87..a361c020 100644 --- a/src/EventLogExpert/Services/PreferencesProvider.cs +++ b/src/EventLogExpert/Services/PreferencesProvider.cs @@ -22,7 +22,7 @@ public sealed class PreferencesProvider : IPreferencesProvider private const string SavedFilters = "saved-filters"; private const string TimeZone = "timezone"; - public IList DisabledDatabasesPreference + public IEnumerable DisabledDatabasesPreference { get => JsonSerializer.Deserialize>(Preferences.Default.Get(DisabledDatabases, "[]")) ?? []; set => Preferences.Default.Set(DisabledDatabases, JsonSerializer.Serialize(value)); @@ -34,17 +34,18 @@ public bool DisplayPaneSelectionPreference set => Preferences.Default.Set(DisplaySelectionEnabled, value); } - public IList EnabledEventTableColumnsPreference + public IEnumerable EnabledEventTableColumnsPreference { get => JsonSerializer.Deserialize>( - Preferences.Default.Get(EnabledEventTableColumns, + Preferences.Default.Get( + EnabledEventTableColumns, $"[{ColumnName.Level:D}, {ColumnName.DateAndTime:D}, {ColumnName.Source:D}, {ColumnName.EventId:D}, {ColumnName.TaskCategory:D}]")) ?? []; set => Preferences.Default.Set(EnabledEventTableColumns, JsonSerializer.Serialize(value)); } - public IList FavoriteFiltersPreference + public IEnumerable FavoriteFiltersPreference { get => JsonSerializer.Deserialize>(Preferences.Default.Get(FavoriteFilters, "[]")) ?? []; set => Preferences.Default.Set(FavoriteFilters, JsonSerializer.Serialize(value)); @@ -72,13 +73,13 @@ public bool PreReleasePreference set => Preferences.Default.Set(PreReleaseEnabled, value); } - public IList RecentFiltersPreference + public IEnumerable RecentFiltersPreference { get => JsonSerializer.Deserialize>(Preferences.Default.Get(RecentFilters, "[]")) ?? []; set => Preferences.Default.Set(RecentFilters, JsonSerializer.Serialize(value)); } - public IList SavedFiltersPreference + public IEnumerable SavedFiltersPreference { get => JsonSerializer.Deserialize>(Preferences.Default.Get(SavedFilters, "[]")) ?? []; set => Preferences.Default.Set(SavedFilters, JsonSerializer.Serialize(value));