C#求助:将发音类数字单词转换为对应数字的功能实现
解决C#中发音相似数字单词转数字的问题
数据结构选择
用**Dictionary<string, int>**是最优方案,它能直接建立「发音相似单词」到「对应数字」的映射关系,查找效率高、逻辑清晰,比数组/列表更适合这种键值配对的场景。根据给定单词数组,对应的映射关系如下:
- zero → 0
- one、won → 1
- two、too、to → 2
- three →3
- four、for、fore →4
- five→5
- six→6
- seven→7
- eight、ate→8
- nine、nein→9
核心实现逻辑
- 预处理输入句子:去除标点符号、统一转为小写,避免大小写和标点干扰匹配(比如原句中的"for,"会被误判,处理后变成"for"才能正确匹配)。
- 分割句子为单词数组:按空格拆分句子,得到独立的单词列表。
- 遍历匹配并生成结果:逐个检查每个单词是否在字典中,若存在则将对应数字追加到结果字符串中。
- 输出最终结果:拼接所有匹配到的数字,得到目标输出。
原代码问题分析
你的代码存在两个核心问题:
- 循环遍历的是句子的每个字符而非每个单词,每次循环都检查整个句子是否包含某个词,导致只要句子里有该词,就会重复输出(循环多少次就输出多少次)。
- 没有按单词出现的顺序处理,而是每次循环都批量输出所有匹配到的词,导致顺序混乱且重复。
修正后的完整代码
using System; using System.Collections.Generic; using System.Linq; class Program { static void Main() { // 建立发音相似单词到数字的映射字典 Dictionary<string, int> numWordMap = new Dictionary<string, int> { {"zero", 0}, {"one", 1}, {"won", 1}, {"two", 2}, {"too", 2}, {"to", 2}, {"three", 3}, {"four", 4}, {"for", 4}, {"fore", 4}, {"five", 5}, {"six", 6}, {"seven", 7}, {"eight", 8}, {"ate", 8}, {"nine", 9}, {"nein", 9} }; string inputSentence = "This is just for a quick test to see if one of these four numbers will show up."; string result = ""; // 预处理:去除标点,转小写,分割为单词数组 var words = inputSentence .Replace(",", "") .Replace("!", "") .Replace(".", "") .ToLower() .Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); // 遍历每个单词,匹配字典并生成结果 foreach (var word in words) { if (numWordMap.TryGetValue(word, out int number)) { result += number.ToString(); } } Console.WriteLine(result); // 输出:4214 Console.ReadKey(); } }
内容的提问来源于stack exchange,提问作者Stiffeno
相关产品推荐
相关产品推荐

