You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将文本文件解析后的行添加到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}");
        }
    }
}

其他代码优化建议

  1. Main方法中的无用字典:你在Main中定义的Dictionary<string, string> line没有被使用,可以直接移除。
  2. Group方法逻辑偏差:该方法是将两行作为一组构建字典,不符合你“每行两个单词”的需求,若无需此逻辑可删除。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:40:41