在論壇上看到一個題目:要求輸入一個漢字,輸出這個漢字的所有讀音(不含聲調並去除重複)。
這道題的關鍵在於要使用一個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();
}
}
}