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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:05:26