在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的值类判断是否继续生产用户对象预制。
  • 当用户输入文本后,将符合条件的数据进行存储,清除原先的,重新生成;或者将满足条件的用户对象显示与不满足条件的进行隐藏。

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

猜你喜欢

转载自www.cnblogs.com/nanyang0310/p/9065741.html