• C#中如何用拼音模糊匹配汉字的首字母


    最近在做一个模拟手机通讯录的管理器时,要用到拼音来查找联系人信息。网上找了很久,没有找到一个很好的解决方法,要么很复杂,要么不可行。后来查到微软官方出了一个专用的汉字转拼音包Microsoft Visual Studio International Pack 1.0 SR1,那问题就变得简单多了。

    首先到官网http://www.microsoft.com/zh-cn/download/details.aspx?id=15251下载安装包,下载完后解压vsintlpack1,里面有7个安装包,只需安装CHSPinYinConv(跟拼音相关)和CHTCHSConv(简体和繁体间的转换)这两个包就可以了,安装完毕后,需要在VS里添加引用,分别引用:C:\Program Files\Microsoft Visual Studio International Pack\Simplified Chinese Pin-Yin Conversion Library下和C:\Program Files\Microsoft Visual Studio International Pack\Traditional Chinese to Simplified Chinese Conversion Library and Add-In Tool下的dll即可使用(这两个路径是你安装时文件存放的位置,通过项目中的引用→浏览   转到安装文件的路径即可找到dll)。接下来引用相关的命名空间using Microsoft.International.Converters.PinYinConverter;

    以下代码是我实现该查询功能的代码:(该系统是用WPF做的,其中datagrid中的数据已从数据库中获取,为了能提高查询速度,该查询的数据源为已加载数据的datagrid)

    using Microsoft.International.Converters.PinYinConverter;
    using System.Collections.ObjectModel; //为了方便,这里只引用关键命名空间
    /// <summary>
            /// 模糊查询
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void txtName_TextChanged(object sender, TextChangedEventArgs e)
            {
                List<T_PhoneContact> check = new List<T_PhoneContact>();
                List<T_PhoneContact> list = new List<T_PhoneContact>();
                list = (List<T_PhoneContact>)datagrid.Items.SourceCollection;
                if (string.IsNullOrEmpty(txtPin.Text)) //如果输入框为空时,加载全部数据
             {
                    BindDGD(); //重新绑定数据源
                } 
               else  if (txtPin.Text.Length>0)
                {
                    //拼音模糊查询法
                    for (int i = 0; i < list.Count; i++)
                    {
                        StringBuilder str=new StringBuilder();//定义一个可变长度的字符串
                        char[] chs; //定义一个字符数组来接收每个汉字的拼音
                   //遍历F_ConnName字段中所有汉字
                        foreach (char c in list[i].F_ConnName.ToCharArray())
                        {
                           //验证该汉字是否合法
                           if (ChineseChar.IsValidChar(c))
                           {
                               ChineseChar CC = new ChineseChar(c);
                                //将该汉字转化为拼音集合
                               ReadOnlyCollection<string> roc = CC.Pinyins;
                              //获取集合中第一个数据即为该汉字的拼音
                               chs=roc[0].ToLower().ToCharArray();
                               //将该汉字的拼音首字母追加到可变字符串中
                               str.Append(chs[0]);
                           }
                        }
                        //判断该字符中是否包含输入的拼音
                        if (str.ToString().Contains(txtPin.Text))
                        {
                            check.Add(list[i]);//将查到的数据加到list中
                        }
                        
                    }
                    datagrid.ItemsSource = check;//重新绑定数据
                }
                
                
            }
           //绑定
           private void BindDGD()
            {
                datagrid.ItemsSource = new T_PhoneContactBLL().ListAll();
            }

    如果哪位有更好的方法,可给我留言,谢谢

  • 相关阅读:
    BubbleGum96 开箱杂谈与软件资源
    Intel Edision —— 从SSH无法连接到systemd
    Intel Edision —— 开发环境选择一贴通
    Intel Edision —— 上电、基本设置与系统初探
    使用RPi-Monitor监控、统计Guitar的运行状态
    吃我一记咸鱼突刺——使用板载RTC定时开机
    Intel Edison —— 控制GPIO接口,网页显示传感器数值
    docker on UP Board
    Android源码分析--CircleImageView 源码详解
    如何自定义一个优雅的ContentProvider
  • 原文地址:https://www.cnblogs.com/qianyaoyuan/p/3105481.html
Copyright © 2020-2023  润新知