如何用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
相关产品推荐
相关产品推荐

