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

C#如何创建支持不同输入数量的类列表以处理可变层数的构造数据

问题原因

你遇到的System.IndexOutOfRangeException异常是因为原有Construction类写死了固定数量的层数字段/属性,当输入文件不同行的层数不一致时,访问了不存在的索引位。以下是完整适配方案:


1. 重构Construction类支持动态层数

保留独立的Name属性满足排序需求,用泛型集合存储动态长度的层数数据:

public class Construction
{
    // 单独暴露Name属性用于排序
    public string Name { get; set; }
    // 动态存储任意数量的层数数据,无长度限制
    public List<double> LayerValues { get; set; } = new List<double>();

    // 可选索引器,支持直接用下标访问层数数据,兼容原有写法
    public double this[int layerIndex]
    {
        get => LayerValues[layerIndex];
        set => LayerValues[layerIndex] = value;
    }
}

2. 动态读取输入文件代码

读取时无需提前约定层数,自动适配每行的列数:

public List<Construction> ReadInputFile(string filePath)
{
    var result = new List<Construction>();
    var allLines = File.ReadAllLines(filePath).Where(l => !string.IsNullOrWhiteSpace(l));
    // 如果有表头,可加.Skip(1)跳过第一行
    foreach (var line in allLines)
    {
        // 分隔符可根据文件格式调整,txt用制表符就改为'\t'
        var columns = line.Split(',', StringSplitOptions.RemoveEmptyEntries);
        if (columns.Length < 1) continue;

        var construction = new Construction
        {
            Name = columns[0].Trim()
        };
        // 剩余所有列自动加入层数集合,不限制数量
        for (int i = 1; i < columns.Length; i++)
        {
            if (double.TryParse(columns[i].Trim(), out var layerValue))
            {
                construction.LayerValues.Add(layerValue);
            }
        }
        result.Add(construction);
    }
    return result;
}

3. 动态导出文件代码

支持自动对齐最大层数,无数据的位置默认补空,也可根据需求改为补0:

public void WriteOutputFile(string filePath, List<Construction> data)
{
    var outputLines = new List<string>();
    // 先获取所有数据的最大层数,确定导出总列数
    int maxLayerCount = data.Max(c => c.LayerValues.Count);

    // 可选:生成表头
    var header = new List<string> { "Name" };
    header.AddRange(Enumerable.Range(1, maxLayerCount).Select(i => $"Layer_{i}"));
    outputLines.Add(string.Join(',', header));

    // 逐行写入数据
    foreach (var item in data)
    {
        var lineColumns = new List<string> { item.Name };
        for (int i = 0; i < maxLayerCount; i++)
        {
            lineColumns.Add(i < item.LayerValues.Count ? 
                item.LayerValues[i].ToString() : string.Empty);
        }
        outputLines.Add(string.Join(',', lineColumns));
    }

    File.WriteAllLines(filePath, outputLines);
}

4. 按Name属性排序实现

直接调用LINQ方法即可,无需额外改造:

// 升序排序
var sortedAscList = constructionList.OrderBy(c => c.Name).ToList();
// 降序排序
var sortedDescList = constructionList.OrderByDescending(c => c.Name).ToList();

注意事项

  • 如果层数数据不是double类型,直接修改LayerValues的泛型参数即可
  • 如果导出不需要对齐列数,直接拼接当前实例的LayerValues即可,无需提前计算最大层数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:06:10