C#实现汉字转汉语拼音的示例代码

 更新时间:2022年03月10日 09:53:06   作者:Dwaynerbing  
这篇文章主要介绍了如何利用C#实现汉字转汉语拼音,文中的示例代码讲解详细,对我们学习C#有一定帮助,感兴趣的小伙伴可以跟随小编一起动手试一试

一、使用PinYinConverterCore获取汉语拼音

最新在做一个搜索组件,需要使用汉语拼音的首字母查询出符合条件的物品名称,由于汉字存在多音字,所以自己写查询组件不太现实,因此,我们使用微软提供的CHSPinYinConvCHSPinYinConv在.net core下载安装没有问题,但在.net framework会由于兼容性会安装失败,因此使用了PinYinConverterCore来实现汉字转拼音,PinYinConverterCore应该也是基于CHSPinYinConv开发的兼容包,后续的代码两个安装包环境下都可以使用。使用Nuget搜索PinYinConverterCore下载并安装,具体如下:

二、编写工具扩展类实现获取汉字的拼音

由于汉字存在多音字,因此,通过汉字获取到的拼音是一个数组,具体如下:

 /// <summary>
    /// 汉字转换拼音
    /// </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());
                }
 
                //去除声调,转小写
                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
                {
                    //全拼循环匹配
                    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
                {
                    //首字母循环匹配
                    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());

我们编写录入一组用户名,然后根据输入输入的用户名的缩写,筛选出符合条件的人,我们可以使用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#实现汉字转汉语拼音的示例代码的文章就介绍到这了,更多相关C#汉字转拼音内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解WCF服务中的svc文件

    详解WCF服务中的svc文件

    本文详细讲解了WCF服务中的svc文件,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • c#友好显示日期 c#日期datetime使用方法

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

    c# datetime根据日期显示几秒前、几分前、几天前、几月前、几年前等格式
    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#使用委托的形式调用线程代码实例

    C#使用委托的形式调用线程代码实例

    今天小编就为大家分享一篇关于C#使用委托的形式调用线程代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 设置C#窗体程序只能启动一次

    设置C#窗体程序只能启动一次

    有时候我们需要我们的软件只可以启动一次,用下面的代码就可以实现啊。
    2009-04-04
  • C#函数式编程中的部分应用详解

    C#函数式编程中的部分应用详解

    这篇文章主要介绍了C#函数式编程中的部分应用详解,本文讲解了何谓函数式编程、函数式编程中的部分应用是什么、部分应用的代码实例,需要的朋友可以参考下
    2015-01-01
  • c#委托学习示例分享

    c#委托学习示例分享

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性,下面是c#委托示例
    2014-03-03
  • C# PLINQ 内存列表查询优化历程

    C# PLINQ 内存列表查询优化历程

    这篇文章主要介绍了C# PLINQ 内存列表查询优化历程的相关资料,需要的朋友可以参考下
    2016-03-03

最新评论