mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-16 11:48:06 +01:00
Materializing lists to prevent rescoring (#42017)
Read title. Making MainListPage materialize search results so enumerating doesn't rescore the item.
This commit is contained in:
@@ -32,9 +32,9 @@ public partial class MainListPage : DynamicListPage,
|
|||||||
|
|
||||||
private readonly IServiceProvider _serviceProvider;
|
private readonly IServiceProvider _serviceProvider;
|
||||||
private readonly TopLevelCommandManager _tlcManager;
|
private readonly TopLevelCommandManager _tlcManager;
|
||||||
private IEnumerable<Scored<IListItem>>? _filteredItems;
|
private List<Scored<IListItem>>? _filteredItems;
|
||||||
private IEnumerable<Scored<IListItem>>? _filteredApps;
|
private List<Scored<IListItem>>? _filteredApps;
|
||||||
private IEnumerable<Scored<IListItem>>? _fallbackItems;
|
private List<Scored<IListItem>>? _fallbackItems;
|
||||||
private bool _includeApps;
|
private bool _includeApps;
|
||||||
private bool _filteredItemsIncludesApps;
|
private bool _filteredItemsIncludesApps;
|
||||||
private int _appResultLimit = 10;
|
private int _appResultLimit = 10;
|
||||||
@@ -158,13 +158,13 @@ public partial class MainListPage : DynamicListPage,
|
|||||||
{
|
{
|
||||||
lock (_tlcManager.TopLevelCommands)
|
lock (_tlcManager.TopLevelCommands)
|
||||||
{
|
{
|
||||||
IEnumerable<Scored<IListItem>> limitedApps = Enumerable.Empty<Scored<IListItem>>();
|
List<Scored<IListItem>> limitedApps = new List<Scored<IListItem>>();
|
||||||
|
|
||||||
// Fuzzy matching can produce a lot of results, so we want to limit the
|
// Fuzzy matching can produce a lot of results, so we want to limit the
|
||||||
// number of apps we show at once if it's a large set.
|
// number of apps we show at once if it's a large set.
|
||||||
if (_filteredApps?.Any() == true)
|
if (_filteredApps?.Count > 0)
|
||||||
{
|
{
|
||||||
limitedApps = _filteredApps.OrderByDescending(s => s.Score).Take(_appResultLimit);
|
limitedApps = _filteredApps.OrderByDescending(s => s.Score).Take(_appResultLimit).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
var items = Enumerable.Empty<Scored<IListItem>>()
|
var items = Enumerable.Empty<Scored<IListItem>>()
|
||||||
@@ -330,23 +330,23 @@ public partial class MainListPage : DynamicListPage,
|
|||||||
{
|
{
|
||||||
newApps = AllAppsCommandProvider.Page.GetItems().ToList();
|
newApps = AllAppsCommandProvider.Page.GetItems().ToList();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (token.IsCancellationRequested)
|
if (token.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (token.IsCancellationRequested)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Produce a list of everything that matches the current filter.
|
// Produce a list of everything that matches the current filter.
|
||||||
_filteredItems = ListHelpers.FilterListWithScores<IListItem>(newFilteredItems ?? [], SearchText, ScoreTopLevelItem);
|
_filteredItems = [.. ListHelpers.FilterListWithScores<IListItem>(newFilteredItems ?? [], SearchText, ScoreTopLevelItem)];
|
||||||
|
|
||||||
|
if (token.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Defaulting scored to 1 but we'll eventually use user rankings
|
// Defaulting scored to 1 but we'll eventually use user rankings
|
||||||
_fallbackItems = newFallbacks.Select(f => new Scored<IListItem> { Item = f, Score = 1 });
|
_fallbackItems = [.. newFallbacks.Select(f => new Scored<IListItem> { Item = f, Score = 1 })];
|
||||||
|
|
||||||
if (token.IsCancellationRequested)
|
if (token.IsCancellationRequested)
|
||||||
{
|
{
|
||||||
@@ -367,7 +367,12 @@ public partial class MainListPage : DynamicListPage,
|
|||||||
// but we need to know the limit now to avoid re-scoring apps
|
// but we need to know the limit now to avoid re-scoring apps
|
||||||
var appLimit = AllAppsCommandProvider.TopLevelResultLimit;
|
var appLimit = AllAppsCommandProvider.TopLevelResultLimit;
|
||||||
|
|
||||||
_filteredApps = scoredApps;
|
_filteredApps = [.. scoredApps];
|
||||||
|
|
||||||
|
if (token.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
RaiseItemsChanged();
|
RaiseItemsChanged();
|
||||||
|
|||||||
Reference in New Issue
Block a user