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

LINQ查询与文件写入问题:如何实现全量车辆日志文件夹生成并正确标记最快圈速

问题分析与解决方案

核心问题根源

你的代码之所以只生成8个车辆文件夹,是因为当某辆车没有符合条件的有效圈速(即所有lap.Number都是null或0)时,FastestLap属性里的Min()方法会抛出InvalidOperationException——空序列无法调用Min。这个异常会直接中断foreach (var car in carList)循环,导致后续车辆的文件夹创建和文件写入操作完全没执行。

修复步骤

1. 先修复FastestLap属性,处理空序列的情况

修改属性逻辑,先检查有效圈速是否存在,不存在时返回一个不会与任何实际圈速冲突的特殊值(比如TimeSpan.MaxValue):

public TimeSpan FastestLap 
{ 
    get 
    {
        // 先筛选出所有有效圈速
        var validLaps = Laps.Where(lap => lap.Number is not null and not 0);
        // 有有效圈速就取最小时间,没有就返回最大TimeSpan(确保不会匹配任何实际圈速)
        return validLaps.Any() ? validLaps.Min(lap => lap.LapTime) : TimeSpan.MaxValue;
    } 
}

2. 优化文件写入时的判断逻辑

为了避免把无效圈速(Number为null或0)错误标记为最快圈,最好在判断时同时验证当前圈速的有效性:

foreach (var car in carList) {
    Directory.CreateDirectory(@$"{outputPath}\{logFileName}\Car{car.Number}");
    foreach (var lap in car.Laps) {
        // 只有当前圈是有效圈,且时间等于最快圈速时才加#
        var shouldAddHash = lap.Number is not null and not 0 && lap.LapTime == car.FastestLap;
        var fileNameSuffix = shouldAddHash ? "#" : "";
        
        using TextWriter tw = new StreamWriter(@$"{outputPath}\{logFileName}\Car{car.Number}\Car{car.Number} Lap{lap.Number} {lap.LapTime.ToString().Replace(":", "-").Replace(".", "-")}{fileNameSuffix}.csv");
        WriteCsvHeader(tw);
        foreach (var telemetryRecord in lap.UniqueTelemetryRecords) {
            WriteCsvLine(tw, lap, telemetryRecord);
        }
    }
}

额外优化建议(提升代码可读性)

可以给Lap类加一个IsValid属性,把圈速有效性的判断逻辑封装起来,让代码更清晰:

public class Lap
{
    // 你的其他属性...
    public int? Number { get; set; }
    public TimeSpan LapTime { get; set; }
    public List<TelemetryRecord> UniqueTelemetryRecords { get; set; } = new();

    // 封装有效性判断
    public bool IsValid => Number is not null and not 0;
}

然后FastestLap和判断逻辑可以改成:

public TimeSpan FastestLap 
{ 
    get 
    {
        var validLaps = Laps.Where(lap => lap.IsValid);
        return validLaps.Any() ? validLaps.Min(lap => lap.LapTime) : TimeSpan.MaxValue;
    } 
}

// 文件写入时的判断
var shouldAddHash = lap.IsValid && lap.LapTime == car.FastestLap;

为什么这样能解决问题

  • 修复后的FastestLap永远不会抛出异常,即使没有有效圈速也能返回一个合法值,保证foreach循环能完整遍历所有20辆车,所有文件夹都会被创建。
  • 只有有效圈速才会参与最快圈速的评选和标记,彻底避免了Lap 0被错误标记的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:52:42