Example #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);
        }
Example #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);
        }
Example #3
0
        /// <summary>
        /// 查询,空格为通配符
        /// </summary>
        /// <param name="keywords"></param>
        /// <returns></returns>
        public List <T> FindWithSpace(string keywords)
        {
            if (_keywordsFunc == null)
            {
                throw new Exception("请先使用SetKeywordsFunc方法。");
            }
            keywords = keywords.ToUpper().Trim();
            if (string.IsNullOrEmpty(keywords))
            {
                return(null);
            }
            if (keywords.Contains(" ") == false)
            {
                return(Find(keywords));
            }

            List <Tuple <string, string[]> > list = new List <Tuple <string, string[]> >();
            List <int> indexs    = new List <int>();
            var        minLength = 0;
            int        keysCount;
            {
                var keys = keywords.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                keysCount = keys.Length;
                for (int i = 0; i < keys.Length; i++)
                {
                    var key    = keys[i];
                    var pykeys = SplitKeywords(key);
                    var min    = int.MaxValue;
                    foreach (var pykey in pykeys)
                    {
                        var keys2 = pykey.Split((char)0);
                        if (min > keys2.Length)
                        {
                            min = keys2.Length;
                        }
                        MergeKeywords(keys2, 0, "", list, i, indexs);
                    }
                    minLength += min;
                }
            }

            PinyinSearch search = new PinyinSearch();

            search.SetKeywords(list);
            search.SetIndexs(indexs.ToArray());

            List <T> result = new List <T>();

            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.Find2(fpy, keyword, pylist, keysCount))
                {
                    result.Add(item);
                }
            }
            return(result);
        }
Example #4
0
        /// <summary>
        /// 查询索引号,空格为通配符
        /// </summary>
        /// <param name="keywords"></param>
        /// <returns></returns>
        public List <int> FindIndexWithSpace(string keywords)
        {
            keywords = keywords.ToUpper().Trim();
            if (string.IsNullOrEmpty(keywords))
            {
                return(null);
            }
            if (keywords.Contains(" ") == false)
            {
                return(FindIndex(keywords));
            }

            List <Tuple <string, string[]> > list = new List <Tuple <string, string[]> >();
            List <int> indexs    = new List <int>();
            var        minLength = 0;
            int        keysCount;
            {
                var keys = keywords.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                keysCount = keys.Length;
                for (int i = 0; i < keys.Length; i++)
                {
                    var key    = keys[i];
                    var pykeys = SplitKeywords(key);
                    var min    = int.MaxValue;
                    foreach (var pykey in pykeys)
                    {
                        var keys2 = pykey.Split((char)0);
                        if (min > keys2.Length)
                        {
                            min = keys2.Length;
                        }
                        MergeKeywords(keys2, 0, "", list, i, indexs);
                    }
                    minLength += min;
                }
            }

            PinyinSearch search = new PinyinSearch();

            search.SetKeywords(list);
            search.SetIndexs(indexs.ToArray());

            List <int> result = new List <int>();

            for (int i = 0; i < _keywords.Length; i++)
            {
                var keywords2 = _keywords[i];
                if (keywords2.Length < minLength)
                {
                    continue;
                }
                var fpy    = _keywordsFirstPinyin[i];
                var pylist = _keywordsPinyin[i];
                if (search.Find2(fpy, keywords2, pylist, keysCount))
                {
                    if (_indexs == null)
                    {
                        result.Add(i);
                    }
                    else
                    {
                        result.Add(_indexs[i]);
                    }
                }
            }
            return(result);
        }
Example #5
0
        /// <summary>
        /// 查询索引号,空格为通配符
        /// </summary>
        /// <param name="keywords"></param>
        /// <returns></returns>
        public List <int> FindIndexWithSpace(string keywords)
        {
            keywords = keywords.ToUpper().Trim();
            if (string.IsNullOrEmpty(keywords))
            {
                return(null);
            }
            if (keywords.Contains(" ") == false)
            {
                return(FindIndex(keywords));
            }

            List <Tuple <string, string[]> > list = new List <Tuple <string, string[]> >();
            List <int> indexs    = new List <int>();
            var        minLength = 0;
            int        keysCount;
            var        minKeys = new HashSet <char>();
            {
                var keys = keywords.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                keysCount = keys.Length;
                for (int i = 0; i < keys.Length; i++)
                {
                    var key      = keys[i];
                    var pykeys   = SplitKeywords(key);
                    var min      = int.MaxValue;
                    var minKeys2 = new HashSet <char>();
                    foreach (var pykey in pykeys)
                    {
                        var keys2 = pykey.Split((char)0);
                        if (min > keys2.Length)
                        {
                            min = keys2.Length;
                            minKeys2.Clear();
                            foreach (var k in keys)
                            {
                                minKeys2.Add(k[0]);
                            }
                        }
                        else if (min == keys2.Length)
                        {
                            var newKeys = new HashSet <char>();
                            foreach (var k in keys)
                            {
                                minKeys2.Add(k[0]);
                            }
                            minKeys2.IntersectWith(newKeys);
                        }
                        MergeKeywords(keys2, 0, "", list, i, indexs);
                    }
                    minLength += min;
                    foreach (var item in minKeys2)
                    {
                        minKeys.Add(item);
                    }
                }
            }
            ulong hash = 0;

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

            PinyinSearch search = new PinyinSearch();

            search.SetKeywords(list);
            search.SetIndexs(indexs.ToArray());

            List <int> result = new List <int>();

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

                var keywords2 = _keywords[i];
                var fpy       = _keywordsFirstPinyin[i];
                var pylist    = _keywordsPinyin[i];
                if (search.Find2(fpy, keywords2, pylist, keysCount))
                {
                    if (_indexs == null || indexs.Count < i)
                    {
                        result.Add(i);
                    }
                    else
                    {
                        result.Add(_indexs[i]);
                    }
                }
            }
            return(result);
        }
Example #6
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);
        }