在论坛上看到一个题目:要求输入一个汉字,输出这个汉字的所有读音(不含声调并去除重复)。
这道题的关键在于要使用一个API,由于系统本身并没有默认带这个API的dll文件,所以就去微软下载了一个Microsoft Visual Studio International Pack 。这个包里面包函了东亚部分国家的语言的发音。
然后添加这个dll文件,调用里面的属性和方法就可以得到这个字的读音的集合。但是我们要对输出的读音进行一个处理——不含声调并去除重复。如果输入一个“调”字,不加任何处理的话,就会输出:DIAO4、DIAO5、TIAO2、TIAO4、 、 、 、 ,前面的四个表示读音,其中数字应该是表示声调,后面的四个是空字符。所以我们首先要把空字符去掉,然后再把每个读音后面的数字去掉,最后再去年相同的读音就行了。去空字符可以使用linq查询语句,去掉数字就可以使用正则表达式了,最后去掉相同的部分就可以使用集合的一个Distinct()方法,这样会使代码精简许多。其中,Distinct()方法返回一个IEnumerableCollection集合,输出这个集合里面的元素就OK了。
具体代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using Microsoft.International.Converters.PinYinConverter; //引入ChnCharInfo的命名空间
using System.Text.RegularExpressions; //引入正则表达式的命名空间
namespace 第三题
{
class Program
{
//输入一个汉字输出这个汉字的所有读音(不含声调并去除重复)
static void Main(string[] args)
{
Console.WriteLine("请输入一个汉字:");
//char word = Convert.ToChar(Console.ReadLine());
string hanzi = Console.ReadLine(); //以字符串的形式输入一个汉字
char word; //定义一个变量,接收单个字符
if (char.TryParse(hanzi, out word)) //尝试将字符串汉字转换为字符
{
if (ChineseChar.IsValidChar(word)) //调用API函数,检查输入的字符是否为汉字字符
{
ChineseChar chnc = new ChineseChar(word); //将汉字字符传入,创建一个ChineseChar对象
//获取该对象的拼音集合,该集合是一个泛型只读集合
System.Collections.ObjectModel.ReadOnlyCollection<string> pinyins = chnc.Pinyins;
//使用linq去掉集合中的null
IEnumerable<string> strs = from pinyin in pinyins where pinyin != null select pinyin;
//声明一个集合,用于存储处理好的拼音
List<string> list = new List<string>();
foreach (var items in strs)
{
string str = Regex.Replace(items.ToLower(), "[0-9]", ""); //使用正则表达式将集合中每个字符串的数字替换为空字符
list.Add(str); //把处理过的字符串添加进list中
//Console.WriteLine(item);
}
//提取list集合中的非重复元素
IEnumerable<string> duyin = list.Distinct<string>();
foreach (var item in duyin) //输出拼音
{
Console.WriteLine(item);
}
}
else
{
Console.WriteLine("您输入的不是有效汉字字符!");
}
}
else
{
Console.WriteLine("您输入的不是有效汉字字符!");
}
Console.ReadKey();
}
}
}