欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#實現(xiàn)漢字轉(zhuǎn)漢語拼音的示例代碼

 更新時間:2022年03月10日 09:53:06   作者:Dwaynerbing  
這篇文章主要介紹了如何利用C#實現(xiàn)漢字轉(zhuǎn)漢語拼音,文中的示例代碼講解詳細,對我們學習C#有一定幫助,感興趣的小伙伴可以跟隨小編一起動手試一試

一、使用PinYinConverterCore獲取漢語拼音

最新在做一個搜索組件,需要使用漢語拼音的首字母查詢出符合條件的物品名稱,由于漢字存在多音字,所以自己寫查詢組件不太現(xiàn)實,因此,我們使用微軟提供的CHSPinYinConv,CHSPinYinConv在.net core下載安裝沒有問題,但在.net framework會由于兼容性會安裝失敗,因此使用了PinYinConverterCore來實現(xiàn)漢字轉(zhuǎn)拼音,PinYinConverterCore應該也是基于CHSPinYinConv開發(fā)的兼容包,后續(xù)的代碼兩個安裝包環(huán)境下都可以使用。使用Nuget搜索PinYinConverterCore下載并安裝,具體如下:

二、編寫工具擴展類實現(xiàn)獲取漢字的拼音

由于漢字存在多音字,因此,通過漢字獲取到的拼音是一個數(shù)組,具體如下:

 /// <summary>
    /// 漢字轉(zhuǎn)換拼音
    /// </summary>
    public static class PingYinUtil
    {
        private static Dictionary<int, List<string>> GetTotalPingYinDictionary(string text)
        {
            var chs = text.ToCharArray();
 
            //記錄每個漢字的全拼
            Dictionary<int, List<string>> totalPingYinList = new Dictionary<int, List<string>>();
 
            for (int i = 0; i < chs.Length; i++)
            {
                var pinyinList = new List<string>();
 
                //是否是有效的漢字
                if (ChineseChar.IsValidChar(chs[i]))
                {
                    ChineseChar cc = new ChineseChar(chs[i]);
                    pinyinList = cc.Pinyins.Where(p => !string.IsNullOrWhiteSpace(p)).ToList();
                }
                else
                {
                    pinyinList.Add(chs[i].ToString());
                }
 
                //去除聲調(diào),轉(zhuǎn)小寫
                pinyinList = pinyinList.ConvertAll(p => Regex.Replace(p, @"\d", "").ToLower());
 
                //去重
                pinyinList = pinyinList.Where(p => !string.IsNullOrWhiteSpace(p)).Distinct().ToList();
                if (pinyinList.Any())
                {
                    totalPingYinList[i] = pinyinList;
                }
            }
 
            return totalPingYinList;
        }
        /// <summary>
        /// 獲取漢語拼音全拼
        /// </summary>
        /// <param name="text">The string.</param>
        /// <returns></returns>
        public static List<string> GetTotalPingYin(this string text)
        {
            var result = new List<string>();
            foreach (var pys in GetTotalPingYinDictionary(text))
            {
                var items = pys.Value;
                if (result.Count <= 0)
                {
                    result = items;
                }
                else
                {
                    //全拼循環(huán)匹配
                    var newTotalPingYinList = new List<string>();
                    foreach (var totalPingYin in result)
                    {
                        newTotalPingYinList.AddRange(items.Select(item => totalPingYin + item));
                    }
                    newTotalPingYinList = newTotalPingYinList.Distinct().ToList();
                    result = newTotalPingYinList;
                }
            }
            return result;
        }
 
        /// <summary>
        /// 獲取漢語拼音首字母
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        public static List<string> GetFirstPingYin(this string text)
        {
            var result = new List<string>();
            foreach (var pys in GetTotalPingYinDictionary(text))
            {
                var items = pys.Value;
                if (result.Count <= 0)
                {
                    result = items.ConvertAll(p => p.Substring(0, 1)).Distinct().ToList();
                }
                else
                {
                    //首字母循環(huán)匹配
                    var newFirstPingYinList = new List<string>();
                    foreach (var firstPingYin in result)
                    {
                        newFirstPingYinList.AddRange(items.Select(item => firstPingYin + item.Substring(0, 1)));
                    }
                    newFirstPingYinList = newFirstPingYinList.Distinct().ToList();
                    result = newFirstPingYinList;
                }
            }
            return result;
        }
    }

三、編寫測試用例

我們編寫一個測試用例,通過輸入的漢字獲取到漢語拼音的全拼和首字母縮寫,具體如下:

// 漢字輸入
string text = TextBoxInput.Text;
 
// 獲取到漢語拼音的全拼
TextBoxTotal.Text = string.Join(",", text.GetTotalPingYin());
 
// 獲取到漢語拼音的首字母
TextBoxFirst.Text = string.Join(",", text.GetFirstPingYin());

我們編寫錄入一組用戶名,然后根據(jù)輸入輸入的用戶名的縮寫,篩選出符合條件的人,我們可以使用Linq模糊查詢,具體如下:

public class Student
    {
        public string Name { get; set; }
        public List<string> Pinyin { get; set; }
    }
 StudentList = new List<Student>
            {
                new Student() {Name = "張三"},
                new Student() {Name = "章黎"},
                new Student() {Name = "張三豐"},
                new Student() {Name = "李四"},
                new Student() {Name = "王五"},
                new Student() {Name = "John"},
                new Student() {Name = "W.吳"},
                new Student() {Name = "阿姨"},
                new Student() {Name = "阿膠"},
                new Student() {Name = "麥合蘇提.麥合蘇提"}
            };
var text = TextBoxSearch.Text;
            foreach (var student in StudentList)
            {
                student.Pinyin = student.Name.GetFirstPingYin();
            }
 
            StudentList = StudentList.Where(s => s.Pinyin.Exists(p=>p.Contains(text))).ToList();

到此這篇關于C#實現(xiàn)漢字轉(zhuǎn)漢語拼音的示例代碼的文章就介紹到這了,更多相關C#漢字轉(zhuǎn)拼音內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解WCF服務中的svc文件

    詳解WCF服務中的svc文件

    本文詳細講解了WCF服務中的svc文件,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • c#友好顯示日期 c#日期datetime使用方法

    c#友好顯示日期 c#日期datetime使用方法

    c# datetime根據(jù)日期顯示幾秒前、幾分前、幾天前、幾月前、幾年前等格式
    2014-01-01
  • 解答“60k”大佬的19道C#面試題(上)

    解答“60k”大佬的19道C#面試題(上)

    這篇文章主要解答了“60k”大佬的19道C#面試題中的10道,文中的面試題比較小眾,作者給了不錯的答案,相信對你以后的面試有所幫助,感興趣就來了解下
    2020-06-06
  • C#驗證用戶輸入信息是否包含危險字符串的方法

    C#驗證用戶輸入信息是否包含危險字符串的方法

    這篇文章主要介紹了C#驗證用戶輸入信息是否包含危險字符串的方法,可針對and、or、exec、insert、select等SQL操作技巧進行過濾操作,非常具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • C#編寫的藝術字類實例代碼

    C#編寫的藝術字類實例代碼

    本文給大家分享使用純C#編寫的藝術字類實例代碼,代碼簡單易懂,需要的朋友參考下本教程
    2016-03-03
  • C#使用委托的形式調(diào)用線程代碼實例

    C#使用委托的形式調(diào)用線程代碼實例

    今天小編就為大家分享一篇關于C#使用委托的形式調(diào)用線程代碼實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • 設置C#窗體程序只能啟動一次

    設置C#窗體程序只能啟動一次

    有時候我們需要我們的軟件只可以啟動一次,用下面的代碼就可以實現(xiàn)啊。
    2009-04-04
  • C#函數(shù)式編程中的部分應用詳解

    C#函數(shù)式編程中的部分應用詳解

    這篇文章主要介紹了C#函數(shù)式編程中的部分應用詳解,本文講解了何謂函數(shù)式編程、函數(shù)式編程中的部分應用是什么、部分應用的代碼實例,需要的朋友可以參考下
    2015-01-01
  • c#委托學習示例分享

    c#委托學習示例分享

    委托是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數(shù)來進行傳遞,這種將方法動態(tài)地賦給參數(shù)的做法,可以避免在程序中大量使用If-Else(Switch)語句,同時使得程序具有更好的可擴展性,下面是c#委托示例
    2014-03-03
  • C# PLINQ 內(nèi)存列表查詢優(yōu)化歷程

    C# PLINQ 內(nèi)存列表查詢優(yōu)化歷程

    這篇文章主要介紹了C# PLINQ 內(nèi)存列表查詢優(yōu)化歷程的相關資料,需要的朋友可以參考下
    2016-03-03

最新評論