最近在做一個模擬手機通訊錄的管理器時,要用到拼音來查找聯系人信息。網上找了很久,沒有找到一個很好的解決方法,要么很復雜,要么不可行。后來查到微軟官方出了一個專用的漢字轉拼音包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(); }
如果哪位有更好的方法,可給我留言,謝謝