diff --git a/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs b/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs
index 127a3b00..a973b63c 100644
--- a/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs
+++ b/Source/LibationAvalonia/ViewModels/ProductsDisplayViewModel.cs
@@ -23,7 +23,7 @@ namespace LibationAvalonia.ViewModels
/// Backing list of all grid entries
private readonly AvaloniaList SOURCE = new();
/// Grid entries included in the filter set. If null, all grid entries are shown
- private List FilteredInGridEntries;
+ private HashSet FilteredInGridEntries;
public string FilterString { get; private set; }
public DataGridCollectionView GridEntries { get; private set; }
@@ -117,7 +117,7 @@ namespace LibationAvalonia.ViewModels
}
//Create the filtered-in list before adding entries to avoid a refresh
- FilteredInGridEntries = QueryResults(geList.Union(geList.OfType().SelectMany(s => s.Children)), FilterString);
+ FilteredInGridEntries = geList.Union(geList.OfType().SelectMany(s => s.Children)).FilterEntries(FilterString);
SOURCE.AddRange(geList.OrderByDescending(e => e.DateAdded));
//Add all children beneath their parent
@@ -301,7 +301,7 @@ namespace LibationAvalonia.ViewModels
if (SOURCE.Count == 0)
return;
- FilteredInGridEntries = QueryResults(SOURCE, searchString);
+ FilteredInGridEntries = SOURCE.FilterEntries(searchString);
await refreshGrid();
}
@@ -318,23 +318,9 @@ namespace LibationAvalonia.ViewModels
return FilteredInGridEntries.Contains(item);
}
- private static List QueryResults(IEnumerable entries, string searchString)
- {
- if (string.IsNullOrEmpty(searchString)) return null;
-
- var searchResultSet = SearchEngineCommands.Search(searchString);
-
- var booksFilteredIn = entries.BookEntries().Join(searchResultSet.Docs, lbe => lbe.AudibleProductId, d => d.ProductId, (lbe, d) => (IGridEntry)lbe);
-
- //Find all series containing children that match the search criteria
- var seriesFilteredIn = entries.SeriesEntries().Where(s => s.Children.Join(searchResultSet.Docs, lbe => lbe.AudibleProductId, d => d.ProductId, (lbe, d) => lbe).Any());
-
- return booksFilteredIn.Concat(seriesFilteredIn).ToList();
- }
-
private async void SearchEngineCommands_SearchEngineUpdated(object sender, EventArgs e)
{
- var filterResults = QueryResults(SOURCE, FilterString);
+ var filterResults = SOURCE.FilterEntries(FilterString);
if (filterResults is not null && FilteredInGridEntries.Intersect(filterResults).Count() != FilteredInGridEntries.Count)
{
diff --git a/Source/LibationAvalonia/ViewModels/RowComparer.cs b/Source/LibationAvalonia/ViewModels/RowComparer.cs
index 743a610f..ef3170d8 100644
--- a/Source/LibationAvalonia/ViewModels/RowComparer.cs
+++ b/Source/LibationAvalonia/ViewModels/RowComparer.cs
@@ -1,25 +1,17 @@
using Avalonia.Controls;
using LibationUiBase.GridView;
-using System.Collections;
-using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;
namespace LibationAvalonia.ViewModels
{
- ///
- /// This compare class ensures that all top-level grid entries (standalone books or series parents)
- /// are sorted by PropertyName while all episodes remain immediately beneath their parents and remain
- /// sorted by series index, ascending. Stable sorting is achieved by comparing the GridEntry.ListIndex
- /// properties when 2 items compare equal.
- ///
- internal class RowComparer : IComparer, IComparer, IComparer