C#读取文本文件生成预订列表仅加载首行的问题求助
问题解决:遍历预订列表时仅处理第一行的问题
你遇到的核心问题不是列表只加载了第一行,而是遍历逻辑错误导致只检查了第一行就终止了,下面逐个分析你的代码问题,并给出修复方案:
第一种实现的问题
第一个版本里,只要第一行的预订编号不匹配,就直接throw new Exception("BookingNotFoundException"),抛出异常会直接终止整个方法,后面的行根本没机会被遍历。
第二种实现的问题
第二个版本里,不管第一行匹配与否,都会执行break:匹配时break退出循环,不匹配时也break退出循环,导致循环只执行一次,永远只检查第一行。
修复后的代码示例
正确的逻辑应该是:遍历所有行,找到匹配的编号就完成核验;如果遍历完所有行都没找到,再抛出异常或提示未找到。
方案1:简化版(用File.ReadAllLines)
public void CheckBookingReference() { // 读取所有行到数组,直接遍历即可 var bookingLines = File.ReadAllLines(BookingFilePath); foreach (var line in bookingLines) { // 跳过空行,避免后续处理出错 if (string.IsNullOrWhiteSpace(line)) continue; string[] bookingData = line.Split(','); // 检查数组长度,防止索引越界 if (bookingData.Length <= 5) continue; // 用TryParse避免格式错误导致崩溃 if (int.TryParse(bookingData[5], out int bookingRef)) { if (bookingRef == BookingReferenceNumber) { Console.WriteLine("Booking found, check in complete."); return; // 找到后直接返回,结束方法 } } // 不匹配就继续遍历下一行,不要在这里中断 } // 遍历完所有行都没找到,再抛出异常 throw new Exception("BookingNotFoundException"); }
方案2:StreamReader版
public void CheckBookingReference() { using (var sr = new StreamReader(BookingFilePath)) { string line; // 逐行读取直到文件结束 while ((line = sr.ReadLine()) != null) { if (string.IsNullOrWhiteSpace(line)) continue; string[] bookingData = line.Split(','); if (bookingData.Length <= 5) continue; if (int.TryParse(bookingData[5], out int bookingRef)) { if (bookingRef == BookingReferenceNumber) { Console.WriteLine("booking found"); return; } } } } // 遍历结束未找到 Console.WriteLine("not found"); // 也可以抛出异常:throw new Exception("BookingNotFoundException"); }
额外建议
- 用
int.TryParse替代int.Parse,避免因为文本中格式错误的编号导致程序崩溃 - 添加空行和数组长度检查,增强代码的健壮性
- 可以考虑把预订数据封装成
Booking类(包含预订号、客人信息等属性),替代直接操作字符串数组,代码可读性会大幅提升
内容的提问来源于stack exchange,提问作者Titaroos
相关产品推荐
相关产品推荐

