在unity中,根據拼音字母進行檢索以及排序


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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM