示例#1
0
        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);
        }
示例#2
0
        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);
        }