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的值類判斷是否繼續生產用戶對象預制。
- 當用戶輸入文本后,將符合條件的數據進行存儲,清除原先的,重新生成;或者將滿足條件的用戶對象顯示與不滿足條件的進行隱藏。

好了,就這么多吧,有什么不理解的可以給我留言。
