/// <summary> /// Searches for any products matching the given keyword and populates the search results. /// </summary> public void Search() { if (!CanSearch()) { if (SearchResults != null && SearchResults.Any()) { SearchResults.Clear(); } return; } try { if (OnSearchStarted != null) { OnSearchStarted(this, new SearchEventArgs { SearchTerm = SearchTerm }); } #if DEBUG System.Diagnostics.Debug.WriteLine(string.Format("Searching products for term '{0}'.", SearchTerm)); var searchStopwatch = new System.Diagnostics.Stopwatch(); searchStopwatch.Start(); #endif var invalidatedMatches = SearchResults.Where(p => !IsMatch(p, SearchTerm)).ToList(); foreach (var match in invalidatedMatches) { SearchResults.Remove(match); } var newMatches = ItemsToSearch .Where(p => !SearchResults.Any(r => r.ProductID == p.ProductID) && IsMatch(p, SearchTerm)) .OrderBy(p => p.Name); foreach (var match in newMatches) { SearchResults.Add(match); } #if DEBUG searchStopwatch.Stop(); System.Diagnostics.Debug.WriteLine(string.Format("Searchings products for term '{0}' finished in {1} millisecond(s) and return {2} result(s).", SearchTerm, searchStopwatch.ElapsedMilliseconds.ToString(), SearchResults.Count.ToString())); #endif } catch { } finally { if (OnSearchFinished != null) { OnSearchFinished(this, new SearchEventArgs { SearchTerm = SearchTerm, SearchResultsCount = SearchResults.Count }); } } }
bool CanSearch() { if (ItemsToSearch == null || !ItemsToSearch.Any() || SearchTerm == HelpText || string.IsNullOrEmpty(SearchTerm) || SearchTerm.Trim().Length < SearchTermMinimumLength) { return(false); } else { return(true); } }