using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using Microsoft.International.Converters.PinYinConverter;
namespace MyConsoleApp.Code
{
public sealed class PinYin
{
private PinYin() { }
/// <summary>
/// 获取首拼或全拼。大写
/// </summary>
/// <param name="chineseString"></param>
/// <param name="isFull">true为全拼,false为首拼</param>
/// <returns></returns>
public static string GetPY(string chineseString, bool isFull)
{
StringBuilder sb = new StringBuilder(50);
foreach (var item in chineseString.ToCharArray())
{
if (!ChineseChar.IsValidChar(item))
{
sb.Append(item);
}
else
{
System.Collections.ObjectModel.ReadOnlyCollection<string> py = new ChineseChar(item).Pinyins;
if (py.Count > 0 && py[0].Length > 0)
{
if (isFull)
sb.Append(py[0].Substring(0, py[0].Length - 1));
else
sb.Append(py[0][0]);
}
}
}
return sb.ToString();
}
/// <summary>
/// 获取首拼(多音字"|"分隔)和全拼
/// </summary>
/// <param name="chineseString"></param>
/// <param name="pyStr"></param>
/// <param name="pyFullStr"></param>
public static void GetHomoPhonePY(string chineseString, out string pyStr, out string pyFullStr)
{
pyStr = GetHomoPhonePY(chineseString);
pyFullStr = GetPY(chineseString, true);
}
/// <summary>
/// 获取多音字首拼(多音字"|"分隔)
/// 鼻咽癌SIEMENS首程->BYASIEMENSSC
/// </summary>
/// <param name="chineseString"></param>
/// <returns></returns>
public static string GetHomoPhonePY(string chineseString)
{
StringBuilder sb = new StringBuilder(50);
char[] chineseCharArray = chineseString.ToCharArray();
Dictionary<int, List<string>> dic = new Dictionary<int, List<string>>();
for (int i = 0; i < chineseCharArray.Length; i++)
{
char item = chineseCharArray[i];
if (!ChineseChar.IsValidChar(item))
{
dic.Add(i, new List<string> { item.ToString() });
}
else
{
ChineseChar chinaChar = new ChineseChar(item);
ReadOnlyCollection<string> py = chinaChar.Pinyins;
if (py.Count > 0 && py[0].Length > 0)
{
dic.Add(i, py.Where(p => !string.IsNullOrEmpty(p)).Select(p => p[0].ToString()).Distinct().ToList());
}
}
}
OutPutHomoPhone(dic, 0, "", ref sb);
return sb.ToString();
}
/// <summary>
/// 递归出多音字的首拼
/// </summary>
/// <param name="dic">多音字字典</param>
/// <param name="key">字典下标</param>
/// <param name="parentValue">递归的首拼</param>
/// <param name="sb">结果对象</param>
private static void OutPutHomoPhone(
Dictionary<int, List<string>> dic,
int key,
string parentValue,
ref StringBuilder sb)
{
if (dic.Keys.Contains(key))
{
foreach (string x in dic[key])
{
if (dic.Keys.Count - 1 >= key)
{
string outString = string.Format("{0}{1}", parentValue, x);
if (outString.Length == dic.Keys.Count)
{
sb.AppendFormat("{0}|", outString);
}
OutPutHomoPhone(dic, key + 1, outString, ref sb);
}
}
}
}
}
}