private SelectableQuote[] SearchQuotesCached(IEnumerable <SelectableQuote> searchSource, SearchCacheKey key) { SelectableQuote[] returnValue = SearchQuotes(searchSource, key.SearchText, key.SearchTarget); // add caching information _oldSearchText = key.SearchText; _oldSearchTarget = key.SearchTarget; _searchResults.Add(key, returnValue); return(returnValue); }
public IList <SelectableQuote> FindQuotes(string searchText, SearchTargets searchTarget) { if (searchText == null) { throw new ArgumentNullException(); } IList <SelectableQuote> returnValue; if (searchText.Length > 0) { // only start caching if number of quotes exceeds the value of _cacheThreshold if (_currentQuotePage.Count >= _cacheThreshold) { if (_searchResults == null) { WeakReference oldReference; // try to get old search results belonging to the current QuotePage if (OldSearchResults.TryGetValue(_currentQuotePage, out oldReference)) { _searchResults = oldReference.Target as Dictionary <SearchCacheKey, SelectableQuote[]>; // if not possible create it newly if (_searchResults == null) { _searchResults = new Dictionary <SearchCacheKey, SelectableQuote[]>(_searchCacheKeyEqualityComparer); OldSearchResults[_currentQuotePage] = new WeakReference(_searchResults); } } else { _searchResults = new Dictionary <SearchCacheKey, SelectableQuote[]>(_searchCacheKeyEqualityComparer); OldSearchResults.Add(_currentQuotePage, new WeakReference(_searchResults)); } } SelectableQuote[] result; SearchCacheKey newKey = new SearchCacheKey(searchText, searchTarget); // does a matching entry already exist? if (_searchResults.TryGetValue(newKey, out result)) { returnValue = result; } // is there an entry that can be reused for searching? else if (searchText.Contains(_oldSearchText, _stringComparison) && ((_oldSearchTarget == searchTarget && _searchResults.TryGetValue(new SearchCacheKey(_oldSearchText, _oldSearchTarget), out result)) || _searchResults.TryGetValue(new SearchCacheKey(_oldSearchText, SearchTargets.Everything), out result))) { returnValue = SearchQuotesCached(result, newKey); } // start search using the whole QuotePage else { returnValue = SearchQuotesCached(_currentQuotePage, newKey); } } // perform uncached search else { returnValue = SearchQuotes(_currentQuotePage, searchText, searchTarget); } } else { returnValue = (_dispatcher != null) ? new DispatchingList <QuotePage, SelectableQuote>(_currentQuotePage, _dispatcher) as IList <SelectableQuote> : _currentQuotePage as IList <SelectableQuote>; } return(returnValue); }