網(wǎng)站首頁 編程語言 正文
一、使用PinYinConverterCore獲取漢語拼音
最新在做一個搜索組件,需要使用漢語拼音的首字母查詢出符合條件的物品名稱,由于漢字存在多音字,所以自己寫查詢組件不太現(xiàn)實,因此,我們使用微軟提供的CHSPinYinConv
,CHSPinYinConv
在.net core下載安裝沒有問題,但在.net framework會由于兼容性會安裝失敗,因此使用了PinYinConverterCore
來實現(xiàn)漢字轉拼音,PinYinConverterCore
應該也是基于CHSPinYinConv
開發(fā)的兼容包,后續(xù)的代碼兩個安裝包環(huán)境下都可以使用。使用Nuget
搜索PinYinConverterCore
下載并安裝,具體如下:
二、編寫工具擴展類實現(xiàn)獲取漢字的拼音
由于漢字存在多音字,因此,通過漢字獲取到的拼音是一個數(shù)組,具體如下:
////// 漢字轉換拼音 /// public static class PingYinUtil { private static Dictionary> GetTotalPingYinDictionary(string text) { var chs = text.ToCharArray(); //記錄每個漢字的全拼 Dictionary > totalPingYinList = new Dictionary >(); for (int i = 0; i < chs.Length; i++) { var pinyinList = new List (); //是否是有效的漢字 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; } /// /// 獲取漢語拼音全拼 /// /// The string. ///public static List GetTotalPingYin(this string text) { var result = new List (); foreach (var pys in GetTotalPingYinDictionary(text)) { var items = pys.Value; if (result.Count <= 0) { result = items; } else { //全拼循環(huán)匹配 var newTotalPingYinList = new List (); foreach (var totalPingYin in result) { newTotalPingYinList.AddRange(items.Select(item => totalPingYin + item)); } newTotalPingYinList = newTotalPingYinList.Distinct().ToList(); result = newTotalPingYinList; } } return result; } /// /// 獲取漢語拼音首字母 /// /// ///public static List GetFirstPingYin(this string text) { var result = new List (); 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 (); 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 ListPinyin { get; set; } }
StudentList = new List{ 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
相關推薦
- 2022-06-20 C語言三種方法解決輪轉數(shù)組問題_C 語言
- 2022-04-03 Python?八個數(shù)據(jù)清洗實例代碼詳解_python
- 2024-04-03 clickhouse報Ports are not available
- 2023-03-17 Python中threading.Timer()定時器實現(xiàn)定時任務_python
- 2022-08-31 C語言數(shù)據(jù)的存儲專項分析_C 語言
- 2022-11-01 Python文件處理與垃圾回收機制詳情_python
- 2022-05-20 ElasticSearch 7.X系列之: 檢索性能優(yōu)化實戰(zhàn)指南
- 2022-04-01 C#對Xamarin框架進行數(shù)據(jù)綁定_C#教程
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支