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