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();
        }

如果哪位有更好的方法,可給我留言,謝謝

 


免責聲明!

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



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