@inherits ViewBase @code { private Dictionary AllTrackSet; private string searchName { get => LocalStorage.GetByCallerMemberName(); set => LocalStorage.SetByCallerMemberName(value); } private string searchArtist { get => LocalStorage.GetByCallerMemberName(); set => LocalStorage.SetByCallerMemberName(value); } private string searchFind { get => LocalStorage.GetByCallerMemberName() ?? "Track"; set => LocalStorage.SetByCallerMemberName(value); } private string searchTrackSetKey { get => LocalStorage.GetByCallerMemberName() ?? "main"; set => LocalStorage.SetByCallerMemberName(value); } private int searchLimitCount { get => LocalStorage.GetByCallerMemberName() ?? 20; set => LocalStorage.SetByCallerMemberName(value); } private bool isSearching = false; private ProgressBar searchProgressBar; private static string resultText; private static IGrouping[] resultTracks; private static FeDisc[] resultDiscs; private DiscDialog dlgDisc; }
Filter
@if (searchFind == "Track") {
}
@if (isSearching) {
}
Result
@resultText
@if (searchFind == "Track" && resultTracks?.Length > 0) { foreach (var item in resultTracks) { } } @if (searchFind == "Disc" && resultDiscs?.Length > 0) {
@foreach (var disc in resultDiscs) { }
}
@code { private async Task SearchGo() { if (isSearching) return; isSearching = true; StateHasChanged(); await Task.Delay(1); var matchedCount = 0; var flagPlus = false; //var filterExpression if (searchFind == "Track") { var filteredList = new List(searchLimitCount); var filters = new List> { p => p.TrackSetKey == searchTrackSetKey }; if (string.IsNullOrEmpty(searchName) == false) { filters.Add(p => p.GetTitleOrFilename().Contains(searchName, StringComparison.OrdinalIgnoreCase)); } if (string.IsNullOrEmpty(searchArtist) == false) { filters.Add(p => p.Tag?.Artist.Contains(searchArtist, StringComparison.OrdinalIgnoreCase) == true); } for (var i = 0; i < DataSet.AllTracks.Length && isSearching; i++) { var item = DataSet.AllTracks[i]; if (filters.All(p => p(item))) { ++matchedCount; if (filteredList.Count < searchLimitCount) { filteredList.Add(item); } else if (matchedCount >= searchLimitCount * 2) { flagPlus = true; break; } } await searchProgressBar.SetProgress((float)i / DataSet.AllTracks.Length, $"Searching {i + 1}/{DataSet.AllTracks.Length} matched:{matchedCount}"); } resultText = $"Result for {searchName.NullOrEmptyEscape("")} on {DataSet.AllTracksSet.Where(p => p.Key == searchTrackSetKey).Select(p => p.Name).FirstOrDefault() ?? "?"} limit {searchLimitCount} of {matchedCount}{(flagPlus ? "+" : "")}"; resultTracks = filteredList .GroupBy(p => p.Disc) .ToArray(); } else if (searchFind == "Disc") { var filteredList = new List(searchLimitCount); var filters = new List> { }; if (string.IsNullOrEmpty(searchName) == false) { filters.Add(p => p.Name.Contains(searchName, StringComparison.OrdinalIgnoreCase)); } if (string.IsNullOrEmpty(searchArtist) == false) { filters.Add(p => p.TrackSets.Any(s => s.Tracks.Any(t => t.Tag?.Artist.Contains(searchArtist, StringComparison.OrdinalIgnoreCase) == true))); } for (var i = 0; i < DataSet.AllDisc.Length && isSearching; i++) { var item = DataSet.AllDisc[i]; if (filters.All(p => p(item))) { ++matchedCount; if (filteredList.Count < searchLimitCount) { filteredList.Add(item); } else if (matchedCount >= searchLimitCount * 2) { flagPlus = true; break; } } await searchProgressBar.SetProgress((float)i / DataSet.AllDisc.Length, $"Searching {i + 1}/{DataSet.AllDisc.Length} matched:{matchedCount}"); } resultText = $"Result for Discs limit {searchLimitCount} of {matchedCount}{(flagPlus ? "+" : "")}"; resultDiscs = filteredList.ToArray(); } isSearching = false; StateHasChanged(); } protected override async Task OnAfterRenderAsync(bool firstRender) { await base.OnAfterRenderAsync(firstRender); if (firstRender) { AllTrackSet = DataSet.AllTracksSet.GroupBy(p => p.Key).ToDictionary(p => p.Key, p => p.First().Name); if (searchFind == "Track" && resultTracks == null) await SearchGo(); if (searchFind == "Disc" && resultDiscs == null) await SearchGo(); else StateHasChanged(); } } }