1.先上将字符串装换成拼音的脚本
using Microsoft.International.Converters.PinYinConverter; using NPinyin; using System; using System.Text; public class PinYinHelper { //中文编码 private static Encoding gb2312 = Encoding.GetEncoding("GB2312"); /// <summary> /// 获取中文首拼音字符串 /// </summary> /// <param name="chineseStr"></param> /// <returns></returns> public static string GetFirstChineseLetter(string chineseStr) { //string pinYinFirstName = Pinyin.ConvertEncoding(chineseStr.Trim(), Encoding.UTF8, gb2312); //return Pinyin.GetInitials(pinYinFirstName); try { if (chineseStr.Length != 0) { StringBuilder fullSpell = new StringBuilder(); for (int i = 0; i < chineseStr.Length; i++) { var chr = chineseStr[i]; fullSpell.Append(GetSpell(chr)[0]); } return fullSpell.ToString().ToUpper(); } } catch (Exception e) { Console.WriteLine("首字母转化出错!" + e.Message); } return string.Empty; } /// <summary> /// 获取中文全部拼音字符串 /// </summary> /// <param name="chineseStr"></param> /// <returns></returns> public static string GetAllChineseLetter(string chineseStr) { string pinYinFullName = Pinyin.GetPinyin(chineseStr.Trim()); return pinYinFullName; } /// <summary> /// 获取中文全部拼音字符串不带空格 /// </summary> /// <param name="chineseStr"></param> /// <returns></returns> public static string GetAllChineseLetterWithoutSpace(string chineseStr) { string pinYinFullName = Pinyin.GetPinyin(chineseStr.Trim()); pinYinFullName = pinYinFullName.Replace(" ", ""); return pinYinFullName; } private static string GetSpell(char chr) { var coverchr = NPinyin.Pinyin.GetPinyin(chr); bool isChineses = ChineseChar.IsValidChar(coverchr[0]); if (isChineses) { ChineseChar chineseChar = new ChineseChar(coverchr[0]); foreach (string value in chineseChar.Pinyins) { if (!string.IsNullOrEmpty(value)) { return value.Remove(value.Length - 1, 1); } } } return coverchr; } }
2.在MySQL中对数据进行拼音排序
string mysqlStr = "select * from users order by CONVERT(UserName USING gbk)";
3.根据用户输入的字符串进行检索
private void OnFindUserInputValueChanged() { m_view.DataSource.Clear();
//m_findUserInputField 用户名输入框 string findName = m_findUserInputField.text; if (findName == "") { LoadData(0); return; } else { List<CustomListViewItemDescription> m_tempItemList = new List<CustomListViewItemDescription>();
//m_userDataList是从数据库读取的数据(自己封装的一个用户数据类,用list进行的存储) for (int i = 0; i < m_userDataList.Count; i++) {
//string.ToUpper();将字符串变成大写 findName = findName.ToUpper();
//将所有的用户名(从MySQL获取到的是中文)转成拼音,并返回首字母 string userName = PinYinHelper.GetFirstChineseLetter(m_userDataList[i].name);
if (findName.Length <= userName.Length) { char[] find = findName.ToCharArray(); char[] user = userName.ToCharArray(); for (int j = 0; j < find.Length; j++) { if (find[j] != user[j]) { break; } if (j == find.Length - 1 && find[j] == user[j]) { CustomListViewItemDescription item = new CustomListViewItemDescription(); item.Name = m_userDataList[i].name; item.Value = m_userDataList[i].account; item.Data = i.ToString(); //将符合条件的数据进行存储 m_tempItemList.Add(item); } } } } for (int i = 0; i < m_tempItemList.Count; i++) { m_view.DataSource.BeginUpdate(); m_view.DataSource.Add(m_tempItemList[i]); } m_view.DataSource.EndUpdate(); } }
4.用户检索的逻辑如下:
- 通过MySQL命令,读取数据库,(也就是有先排序的读取)
- 当用户名输入框为空时,显示一定的满足条件的用户信息列表,不要全部加载,这样很容易卡顿,我这里用的是UIWidgets插件,里面有写好封装好了的例子,我最初的做法是根据用户显示区域(ScrollRect)中的Scrollbar的值类判断是否继续生产用户对象预制。
- 当用户输入文本后,将符合条件的数据进行存储,清除原先的,重新生成;或者将满足条件的用户对象显示与不满足条件的进行隐藏。
好了,就这么多吧,有什么不理解的可以给我留言。