using Microsoft.International.Converters.PinYinConverter; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace ShadowEditor.Server.Helpers { /// /// 拼音帮助类 /// /// public class PinYinHelper { public static PinYinModel GetTotalPinYin(string str) { var chs = str.ToCharArray(); //记录每个汉字的全拼 Dictionary> totalPinYins = new Dictionary>(); for (int i = 0; i < chs.Length; i++) { var pinyins = new List(); var ch = chs[i]; //是否是有效的汉字 if (ChineseChar.IsValidChar(ch)) { ChineseChar cc = new ChineseChar(ch); pinyins = cc.Pinyins.Where(p => !string.IsNullOrWhiteSpace(p)).ToList(); } else { pinyins.Add(ch.ToString()); } //去除声调,转小写 pinyins = pinyins.ConvertAll(p => Regex.Replace(p, @"\d", "").ToLower()); //去重 pinyins = pinyins.Where(p => !string.IsNullOrWhiteSpace(p)).Distinct().ToList(); if (pinyins.Any()) { totalPinYins[i] = pinyins; } } PinYinModel result = new PinYinModel(); foreach (var pinyins in totalPinYins) { var items = pinyins.Value; if (result.TotalPinYin.Count <= 0) { result.TotalPinYin = items; result.FirstPinYin = items.ConvertAll(p => p.Substring(0, 1)).Distinct().ToList(); } else { //全拼循环匹配 var newTotalPinYins = new List(); foreach (var totalPinYin in result.TotalPinYin) { newTotalPinYins.AddRange(items.Select(item => totalPinYin + item)); } newTotalPinYins = newTotalPinYins.Distinct().ToList(); result.TotalPinYin = newTotalPinYins; //首字母循环匹配 var newFirstPinYins = new List(); foreach (var firstPinYin in result.FirstPinYin) { newFirstPinYins.AddRange(items.Select(item => firstPinYin + item.Substring(0, 1))); } newFirstPinYins = newFirstPinYins.Distinct().ToList(); result.FirstPinYin = newFirstPinYins; } } return result; } } public class PinYinModel { public PinYinModel() { TotalPinYin = new List(); FirstPinYin = new List(); } //全拼 public List TotalPinYin { get; set; } //首拼 public List FirstPinYin { get; set; } } }