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

如何用StreamReader读取文件并关联映射多行到Dictionary键值对?

解决将文件内容映射到Dictionary<string, List>的问题

我明白你现在的需求:把文件里以单引号开头的行作为键,紧接着的下一行作为对应键的列表值。你目前的代码已经能识别键,但还没处理值和键的关联,我来帮你调整下逻辑:

核心思路是记住上一个读到的键,当遇到非键行时,就把这行内容加到对应键的列表里。具体修改如下:

reactionInfo = new Dictionary<string, List<string>>();
string line;
string lastKey = null; // 用来保存最近读到的键
StreamReader reader = new StreamReader(filePath);

while ((line = reader.ReadLine()) != null)
{
    var trimmedLine = line.Trim();
    // 判断当前行是否是键行
    if (!string.IsNullOrEmpty(trimmedLine) && trimmedLine.StartsWith("'"))
    {
        lastKey = line; // 记录当前键(这里你可以选择用trimmedLine还是原line,看你的需求)
        // 确保字典里存在这个键对应的List,如果没有就创建
        if (!reactionInfo.ContainsKey(lastKey))
        {
            reactionInfo.Add(lastKey, new List<string>());
        }
    }
    // 如果当前行不是键,且有活跃的键(lastKey不为空)
    else if (lastKey != null && !string.IsNullOrEmpty(trimmedLine))
    {
        // 将当前行的值添加到对应键的List中
        reactionInfo[lastKey].Add(line);
        // 如果你的值是一行包含多个值(比如示例里的"Value1another Value2anotherKey"),可以按空格分割后添加:
        // foreach(var value in trimmedLine.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries))
        // {
        //     reactionInfo[lastKey].Add(value);
        // }
    }
}
reader.Close(); // 记得关闭流,或者用using语句更安全

关键修改点说明:

  • 新增了lastKey变量,用来追踪最近一次读到的键,这样就能把后续的非键行和这个键关联起来
  • 优化了键行的判断:先判断行不为空再检查开头,避免空行报错
  • 添加了非键行的处理逻辑:当有活跃键时,把当前行内容加到对应列表里
  • 额外提示:如果你的值行里包含多个值,可以用Split方法分割后逐个添加到列表,我在代码里加了注释的示例

另外,更推荐使用using语句来管理StreamReader,这样可以自动释放资源,避免忘记关闭流:

reactionInfo = new Dictionary<string, List<string>>();
string lastKey = null;

using (StreamReader reader = new StreamReader(filePath))
{
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        var trimmedLine = line.Trim();
        if (!string.IsNullOrEmpty(trimmedLine) && trimmedLine.StartsWith("'"))
        {
            lastKey = line;
            if (!reactionInfo.ContainsKey(lastKey))
            {
                reactionInfo.Add(lastKey, new List<string>());
            }
        }
        else if (lastKey != null && !string.IsNullOrEmpty(trimmedLine))
        {
            reactionInfo[lastKey].Add(line);
            // 多值分割的话取消下面注释
            // foreach(var val in trimmedLine.Split(' ', StringSplitOptions.RemoveEmptyEntries))
            // {
            //     reactionInfo[lastKey].Add(val);
            // }
        }
    }
}

这样处理后,就能正确把每个键对应的下一行(或多行)值存入字典的列表中啦。

内容的提问来源于stack exchange,提问作者Matthias Dorfschmid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:23:18