예제 #1
0
        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public List <string> Find(string key)
        {
            if (string.IsNullOrEmpty(key))
            {
                return(null);
            }
            key = key.ToUpper();
            var hasPinyin = Regex.IsMatch(key, "[a-zA-Z]");

            if (hasPinyin == false)
            {
                List <string> rs = new List <string>();
                for (int i = 0; i < _keywords.Length; i++)
                {
                    var keyword = _keywords[i];
                    if (keyword.Contains(key))
                    {
                        rs.Add(keyword);
                    }
                }
                return(rs);
            }

            var pykeys    = SplitKeywords(key);
            var minLength = int.MaxValue;
            List <Tuple <string, string[]> > list = new List <Tuple <string, string[]> >();

            foreach (var pykey in pykeys)
            {
                var keys = pykey.Split((char)0);
                if (minLength > keys.Length)
                {
                    minLength = keys.Length;
                }
                MergeKeywords(keys, 0, "", list);
            }

            PinyinSearch search = new PinyinSearch();

            search.SetKeywords(list);
            List <String> result = new List <string>();

            for (int i = 0; i < _keywords.Length; i++)
            {
                var keywords = _keywords[i];
                if (keywords.Length < minLength)
                {
                    continue;
                }
                var fpy    = _keywordsFirstPinyin[i];
                var pylist = _keywordsPinyin[i];


                if (search.Find(fpy, keywords, pylist))
                {
                    result.Add(keywords);
                }
            }
            return(result);
        }
예제 #2
0
        /// <summary>
        /// 查询
        /// </summary>
        /// <param name="keywords"></param>
        /// <returns></returns>
        public List <T> Find(string keywords)
        {
            if (_keywordsFunc == null)
            {
                throw new Exception("请先使用SetKeywordsFunc方法。");
            }
            keywords = keywords.ToUpper().Trim();
            if (string.IsNullOrEmpty(keywords))
            {
                return(null);
            }
            List <T> result    = new List <T>();
            var      hasPinyin = Regex.IsMatch(keywords, "[a-zA-Z]");

            if (hasPinyin == false)
            {
                foreach (var item in _list)
                {
                    var keyword = _keywordsFunc(item);
                    if (keyword.Contains(keywords))
                    {
                        result.Add(item);
                    }
                }
                return(result);
            }

            var pykeys    = SplitKeywords(keywords);
            var minLength = int.MaxValue;
            List <Tuple <string, string[]> > list = new List <Tuple <string, string[]> >();

            foreach (var pykey in pykeys)
            {
                var keys = pykey.Split((char)0);
                if (minLength > keys.Length)
                {
                    minLength = keys.Length;
                }
                MergeKeywords(keys, 0, "", list);
            }

            PinyinSearch search = new PinyinSearch();

            search.SetKeywords(list);
            foreach (var item in _list)
            {
                var keyword = _keywordsFunc(item);
                if (keyword.Length < minLength)
                {
                    continue;
                }
                string   fpy = "";
                string[] pylist;
                if (_pinyinFunc == null)
                {
                    pylist = PinyinDict.GetPinyinList(keyword);
                }
                else
                {
                    pylist = _pinyinFunc(item).Split(_splitChar);
                }
                for (int j = 0; j < pylist.Length; j++)
                {
                    pylist[j] = pylist[j].ToUpper();
                    fpy      += pylist[j][0];
                }
                if (search.Find(fpy, keyword, pylist))
                {
                    result.Add(item);
                }
            }
            return(result);
        }
예제 #3
0
        /// <summary>
        /// 查询索引号
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public List <int> FindIndex(string key)
        {
            key = key.ToUpper().Trim();
            if (string.IsNullOrEmpty(key))
            {
                return(null);
            }
            var hasPinyin = Regex.IsMatch(key, "[a-zA-Z]");

            if (hasPinyin == false)
            {
                List <int> rs = new List <int>();
                for (int i = 0; i < _keywords.Count; i++)
                {
                    var keyword = _keywords[i];
                    if (keyword.Contains(key))
                    {
                        if (_indexs == null)
                        {
                            rs.Add(i);
                        }
                        else
                        {
                            rs.Add(_indexs[i]);
                        }
                    }
                }
                return(rs);
            }

            var pykeys    = SplitKeywords(key);
            var minLength = int.MaxValue;
            var minKeys   = new HashSet <char>();
            List <Tuple <string, string[]> > list = new List <Tuple <string, string[]> >();

            foreach (var pykey in pykeys)
            {
                var keys = pykey.Split((char)0);
                if (minLength > keys.Length)
                {
                    minLength = keys.Length;
                    foreach (var k in keys)
                    {
                        minKeys.Add(k[0]);
                    }
                }
                else if (minLength == keys.Length)
                {
                    var newKeys = new HashSet <char>();
                    foreach (var k in keys)
                    {
                        newKeys.Add(k[0]);
                    }
                    minKeys.IntersectWith(newKeys);
                }
                MergeKeywords(keys, 0, "", list);
            }

            ulong hash = 0;

            foreach (var k in minKeys)
            {
                hash = BuildHashByChar(hash, k);
            }
            hash = BuildHashByLength(hash, minLength);

            PinyinSearch search = new PinyinSearch();

            search.SetKeywords(list);
            List <int> result = new List <int>();

            for (int i = 0; i < _keywords.Count; i++)
            {
                if ((_hash[i] & hash) != hash)
                {
                    continue;
                }

                var keywords = _keywords[i];
                var fpy      = _keywordsFirstPinyin[i];
                var pylist   = _keywordsPinyin[i];
                if (search.Find(fpy, keywords, pylist))
                {
                    if (_indexs == null || _indexs.Count < i)
                    {
                        result.Add(i);
                    }
                    else
                    {
                        result.Add(_indexs[i]);
                    }
                }
            }
            return(result);
        }