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

