/// <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); }
/// <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); }
/// <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); }