如何将文本文件解析后的行添加到C# Dictionary中?
问题解决:读取每行双单词的文本文件构建Dictionary
核心修复点
你当前的错误在于ReadStream2方法中,拆分每行后错误地将整行内容同时作为键和值添加到字典。正确的做法是使用Split得到的字符串数组的两个元素,分别作为字典的键和值。
同时需要处理两种异常情况:
- 某行内容无法拆分成两个单词(比如空行、只有一个单词)
- 重复的键(字典不允许重复键)
修复后的ReadStream2方法
static void ReadStream2(FileStream fileStream, string path) { using (fileStream = new FileStream(path, FileMode.Open, FileAccess.Read)) { Dictionary<string, string> dictionary = new Dictionary<string, string>(); using (StreamReader reader = new StreamReader(fileStream)) { string line; while ((line = reader.ReadLine()) != null) { // 跳过空行 if (string.IsNullOrWhiteSpace(line)) continue; string[] words = line.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); // 检查是否拆分成了两个单词 if (words.Length != 2) { Console.WriteLine($"无效行:{line},该行不是两个单词"); continue; } string key = words[0].Trim(); string value = words[1].Trim(); // 避免重复键 if (!dictionary.ContainsKey(key)) { dictionary.Add(key, value); Console.WriteLine($"已添加:{key} -> {value}"); } else { Console.WriteLine($"重复键:{key},已跳过"); } } } // 打印最终字典内容 Console.WriteLine("\n最终字典内容:"); foreach (var pair in dictionary) { Console.WriteLine($"{pair.Key} : {pair.Value}"); } } }
其他代码优化建议
Main方法中的无用字典:你在Main中定义的Dictionary<string, string> line没有被使用,可以直接移除。Group方法逻辑偏差:该方法是将两行作为一组构建字典,不符合你“每行两个单词”的需求,若无需此逻辑可删除。askWord方法语法修复:原方法中if (ask == )缺少比较对象,可补充为从字典中查询翻译的逻辑。
完整修正后的代码
class Program { static void Main(string[] args) { FileStream filestream = null; string path = "Dictionary.txt"; Menu(filestream, path); } static void WriteByte(FileStream filestream, string path) { string str; Console.WriteLine("Enter word"); str = Console.ReadLine(); try { filestream = new FileStream("Dictionary.txt", FileMode.Open, FileAccess.Write); byte[] by = Encoding.Default.GetBytes(str); filestream.Write(by, 0, by.Length); Console.WriteLine("File written"); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { filestream?.Close(); } } static void ReadByte(FileStream filestream, string path) { try { filestream = new FileStream(path, FileMode.Open, FileAccess.Read); byte[] by = new byte[(int)filestream.Length]; filestream.Read(by, 0, by.Length); string str = Encoding.Default.GetString(by); Console.WriteLine("File read: " + str); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { filestream?.Close(); } } static void WriteStream(FileStream filestream, string path) { using (filestream = new FileStream(path, FileMode.Append, FileAccess.Write)) { using (StreamWriter streamWriter = new StreamWriter(filestream)) { Console.WriteLine("输入两个单词(空格分隔):"); string str = Console.ReadLine(); streamWriter.WriteLine(str); Console.WriteLine("已写入文件"); } } } static void ReadStream2(FileStream fileStream, string path) { using (fileStream = new FileStream(path, FileMode.Open, FileAccess.Read)) { Dictionary<string, string> dictionary = new Dictionary<string, string>(); using (StreamReader reader = new StreamReader(fileStream)) { string line; while ((line = reader.ReadLine()) != null) { if (string.IsNullOrWhiteSpace(line)) continue; string[] words = line.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); if (words.Length != 2) { Console.WriteLine($"无效行:{line},格式错误"); continue; } string key = words[0].Trim(); string value = words[1].Trim(); if (!dictionary.ContainsKey(key)) { dictionary.Add(key, value); Console.WriteLine($"添加成功:{key} -> {value}"); } else { Console.WriteLine($"警告:键 {key} 已存在,跳过该行"); } } } Console.WriteLine("\n字典内容如下:"); foreach (var pair in dictionary) { Console.WriteLine($"{pair.Key} : {pair.Value}"); } } } static void Menu(FileStream fileStream, string path) { char choice; do { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("\n=== 英语词典菜单 ==="); Console.WriteLine("1. 读取词典"); Console.WriteLine("2. 添加单词"); Console.WriteLine("3. 退出"); Console.ResetColor(); Console.Write("请选择操作:"); choice = Convert.ToChar(Console.ReadLine()); switch (choice) { case '1': ReadStream2(fileStream, path); break; case '2': WriteStream(fileStream, path); break; case '3': Console.WriteLine("退出程序"); break; default: Console.WriteLine("无效选择,请重新输入"); break; } } while (choice != '3'); } static void AskWord(Dictionary<string, string> dictionary) { Console.WriteLine("请输入要查询的英文单词:"); string ask = Console.ReadLine().Trim(); if (dictionary.TryGetValue(ask, out string translation)) { Console.WriteLine($"{ask} 的翻译是:{translation}"); } else { Console.WriteLine($"未找到单词 {ask}"); } } }
内容的提问来源于stack exchange,提问作者Larrythelobster
相关产品推荐
相关产品推荐

