C#实现汉字转汉语拼音的示例代码
作者:Dwaynerbing 时间:2022-08-05 14:04:53
一、使用PinYinConverterCore获取汉语拼音
最新在做一个搜索组件,需要使用汉语拼音的首字母查询出符合条件的物品名称,由于汉字存在多音字,所以自己写查询组件不太现实,因此,我们使用微软提供的CHSPinYinConv
,CHSPinYinConv
在.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();
来源:https://www.cnblogs.com/dongweian/p/15715099.html
标签:C#,汉字,拼音
0
投稿
猜你喜欢
Java反射机制深入理解
2022-11-24 14:58:14
C# 程序集和反射详解
2022-12-29 20:24:18
基于C#的音乐播放器主Form实现代码
2022-07-13 01:21:36
java多线程并发中使用Lockers类将多线程共享资源锁定
2021-11-14 11:08:37
Java实现按权重随机数
2023-11-28 23:15:32
spring boot如何使用AOP统一处理web请求
2023-05-16 14:15:11
C#实现简单获取及设置Session类
2021-07-09 06:19:27
Java单例模式的线程安全,饿汉和懒汉模式详解
2022-05-31 16:12:08
Java字节码ByteBuddy使用及原理解析上
2023-08-23 19:33:05
举例讲解Java中Piped管道输入输出流的线程通信控制
2021-06-25 14:19:58
springboot vue前后端接口测试树结点添加功能
2022-05-22 18:51:09
Java如何跳过https的ssl证书验证详解
2023-08-24 11:34:56
Android实现购物车及其他功能的角标
2021-12-24 10:54:54
Java实现批量下载(打包成zip)的实现
2022-04-02 01:53:05
分享安装Android Studio3.6的经验教训
2021-12-24 07:39:29
关于ObjectUtils.isEmpty() 和 null 的区别
2022-05-07 17:10:56
Java实现分页的前台页面和后台代码
2021-07-22 17:10:04
Android实现屏幕旋转四个方向准确监听
2022-06-07 08:57:32
如何在MyBatis中实现DataSource
2021-11-29 13:49:48
Java接口返回json如何忽略特定属性
2022-03-16 07:54:24