zoukankan      html  css  js  c++  java
  • C# PinYinHelper

    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);
                        }
                    }
                }
            }
     
        }
    }
    View Code
  • 相关阅读:
    【JDBC】JDBC实战
    【JDBC】JDBC操作实战
    【Oracle】事务、表复制
    Hibernate 再接触 继承映射
    Hibernate 再接触 集合映射
    Hibernate 再接触 CRUD
    Hibernate 再接触 多对多单向双向关联
    Hibernnate 一对多多对一双向关联
    Hibernate 再接触 一对多单向关联
    Hibernate 再接触 多对一与一对多
  • 原文地址:https://www.cnblogs.com/jcdd-4041/p/4139953.html
Copyright © 2011-2022 走看看