产线上新增了5台焊接机器人,领导要求把每台设备的实时温度都显示在监控界面上。
你打开 VS,写了一个 float[] temps = new float[5],心想完事了。
结果第二周又加了3台,你只能回去改代码,把 5 改成 8……
第三周又加了2台。
「这数组到底要写多大才够用?」
如果你有这个困惑,今天这篇文章正好帮你解决它。
「上一节我们学了数组,掌握了一维、多维与交错数组的声明和使用方法。今天在这个基础上,我们进一步学习 List<T> 泛型集合——一种比数组更灵活、更适合工业动态数据的容器。」
数组(Array)有一个硬伤:长度一旦定好,就不能改变。
你在程序启动时声明了 int[] alarmCodes = new int[10],最多只能存10条报警记录。第11条进来,直接越界崩溃。
在工厂环境里,设备数量、报警条数、生产记录——这些数据天生就是动态的,数组应付起来很吃力。
List<T>(泛型列表) 就是为了解决这个问题而生的。
List<T> 是 C# 提供的一种 动态数组(可以自动扩容的集合容器)。
这里的 T 是一个占位符,代表你要存什么类型的数据。
List<float>List<int>List<string>「把 T 理解成一个模具,你告诉它用什么材料,它就帮你做出对应的容器。」
| 对比项 | 数组 Array | 列表 List<T> |
|---|---|---|
| 长度是否固定 | ✅ 固定,声明时确定 | ❌ 动态,随时增删 |
| 添加元素 | ❌ 不支持直接添加 | ✅ .Add() 一行搞定 |
| 适合场景 | 数量确定的静态数据 | 数量变化的动态数据 |
| 性能 | 略高(内存连续) | 略低(但工业场景够用) |
大多数工厂应用场景,List<T> 是首选,数组反而用得少。
掌握以下6个操作,日常开发够用了:
① 创建列表
csharpvar alarmList = new List<int>(); // 空列表
var deviceNames = new List<string> { "焊接机1号", "焊接机2号" }; // 带初始值
② 添加元素 .Add()
csharpalarmList.Add(1001); // 添加一条报警码
alarmList.Add(1002);
③ 删除元素 .Remove() / .RemoveAt()
csharpalarmList.Remove(1001); // 按值删除
alarmList.RemoveAt(0); // 按位置删除(第1个)
④ 查找元素 .Contains() / .Find()
csharpbool exists = alarmList.Contains(1002); // 是否存在某个值
⑤ 获取数量 .Count
csharpint total = alarmList.Count; // 当前有多少条记录
⑥ 遍历列表
csharpforeach (var code in alarmList)
{
Console.WriteLine($"报警码:{code}");
}
「记住这6个操作,List<T> 的80%使用场景都覆盖了。」
第一次看到 <T> 可能会懵。
泛型 的意思是:这个容器的"规格"由你来定,而不是写死的。
类比工厂里的周转箱:同一款箱子,装螺丝就是"螺丝箱",装轴承就是"轴承箱",箱子本身的结构没变,只是装的东西不同。
List<T> 就是这个"通用箱子",T 就是你要装的"货物类型"。
Step 1:新建控制台项目
打开 VS2026,选择 文件 > 新建 > 项目,搜索「控制台应用」,选择 .NET 10 框架,项目名填 ListDemo,点击创建。
Step 2:编写 List<T> 代码
打开 Program.cs,清空默认内容,按照下方代码示例输入。
输入 var alarmList = new List 时,VS2026 的 IntelliSense(智能代码补全)会自动弹出 List<T> 的类型提示,按 Tab 键快速补全。
Step 3:运行并查看输出
按 F5 启动调试,或点击顶部工具栏的 ▶ 按钮。
输出结果会显示在底部的「终端」窗口中。
VS2026 Copilot 辅助:如果运行报错,Copilot 会在错误行旁边显示 💡 图标,点击可获得"一键修复"建议,非常适合初学阶段快速排错。
如果你想用 Vibe Coding 方式让 Copilot 帮你生成代码,可以在 VS2026 的 Copilot 对话框中输入以下 Prompt:
用 C# 14 和 .NET 10 写一个控制台程序, 使用 List<string> 存储5台注塑机的设备名称, 演示添加、删除、遍历操作, 变量名使用工业语义命名,每行关键代码加中文注释。
Copilot 会直接生成可运行的完整代码,你只需要检查逻辑是否符合需求即可。
这段代码演示了用 List<string> 管理注塑车间的设备列表,包含添加、删除、查找和遍历的完整操作流程。
csharp// =============================================
// 示例:注塑车间设备列表管理
// 平台:VS2026 + .NET 10 + C# 14
// =============================================
using System;
using System.Collections.Generic;
// 【1】创建设备名称列表(初始包含3台设备)
var deviceNameList = new List<string>
{
"注塑机1号",
"注塑机2号",
"注塑机3号"
};
Console.WriteLine("===== 当前设备列表 =====");
// 【2】遍历并输出所有设备名称
foreach (var deviceName in deviceNameList)
{
Console.WriteLine($" 设备:{deviceName}");
}
Console.WriteLine($"\n当前设备总数:{deviceNameList.Count} 台");
// 【3】新增设备(模拟产线扩产)
deviceNameList.Add("注塑机4号");
deviceNameList.Add("注塑机5号");
Console.WriteLine("\n===== 新增2台设备后 =====");
Console.WriteLine($"当前设备总数:{deviceNameList.Count} 台");
// 【4】检查某台设备是否在列表中
string targetDevice = "注塑机3号";
bool isOnline = deviceNameList.Contains(targetDevice);
Console.WriteLine($"\n{targetDevice} 是否在线:{isOnline}");
// 【5】移除一台设备(模拟设备下线)
deviceNameList.Remove("注塑机2号");
Console.WriteLine("\n注塑机2号已下线,从列表移除。");
// 【6】按索引访问(获取第1台设备,索引从0开始)
string firstDevice = deviceNameList[0];
Console.WriteLine($"当前列表第一台设备:{firstDevice}");
// 【7】输出最终设备列表
Console.WriteLine("\n===== 最终设备列表 =====");
for (int i = 0; i < deviceNameList.Count; i++)
{
Console.WriteLine($" [{i + 1}] {deviceNameList[i]}");
}

运行后,你会在终端窗口看到设备列表的动态变化过程:从3台到5台,再到移除1台后的4台,每次操作结果都清晰打印出来。整个过程不需要改一行长度定义,List 自动帮你管好了。
场景任务: 冲压车间需要实时记录每次冲压的压力值(单位:kN),并在超过阈值时自动标记为异常,最终输出本班次所有异常记录。
思路拆解:
List<float> 存储每次冲压的压力采样值。alarmThreshold = 850f(kN)。List<float>(异常列表)。csharp// =============================================
// 实战案例:冲压车间压力异常记录
// 平台:VS2026 + .NET 10 + C# 14
// =============================================
using System;
using System.Collections.Generic;
// 【1】模拟本班次冲压压力采样数据(单位:kN)
// 实际项目中这里替换为从 PLC 读取的真实数据
var pressureSamples = new List<float>
{
780f, 810f, 860f, 795f, 900f,
830f, 875f, 760f, 920f, 805f
};
// 【2】设定报警阈值
float alarmThreshold = 850f;
// 【3】创建异常记录列表
var alarmPressureList = new List<float>();
// 【4】遍历采样数据,筛选超阈值记录
foreach (var pressure in pressureSamples)
{
if (pressure > alarmThreshold)
{
alarmPressureList.Add(pressure);
}
}
Console.OutputEncoding=System.Text.Encoding.UTF8; // 支持输出特殊符号
// 【5】输出结果
Console.WriteLine($"本班次冲压总次数:{pressureSamples.Count} 次");
Console.WriteLine($"报警阈值:{alarmThreshold} kN");
Console.WriteLine($"异常冲压次数:{alarmPressureList.Count} 次\n");
if (alarmPressureList.Count > 0)
{
Console.WriteLine("===== 异常压力记录 =====");
foreach (var alarmValue in alarmPressureList)
{
Console.WriteLine($" ⚠️ 压力值:{alarmValue} kN(超出阈值)");
}
}
else
{
Console.WriteLine("本班次无异常冲压记录,生产正常。");
}

运行后终端会输出本班次共4次异常冲压记录(860、900、875、920 kN),清晰列出每次超阈值的压力值,为班组长的交接报告提供数据支撑。
坑1:用数组的方式给 List 赋初值
❌ 错误做法:alarmList[0] = 1001;(List 为空时直接按索引赋值)
✅ 正确做法:alarmList.Add(1001);
📌 原因:空 List 没有任何元素,按索引访问会直接抛出 ArgumentOutOfRangeException,就像往空抽屉里抽第一格,抽屉根本不存在。
坑2:在 foreach 循环里删除元素
❌ 错误做法:在 foreach (var item in list) 内部调用 list.Remove(item)
✅ 正确做法:先用另一个列表收集要删的项,循环结束后再统一删除,或改用 list.RemoveAll(x => 条件) 一行搞定。
📌 原因:foreach 遍历时不允许修改集合,否则运行时会抛出 InvalidOperationException,这是新手最容易踩的坑之一。
坑3:混淆 .Count 和数组的 .Length
❌ 错误做法:alarmList.Length(List 没有这个属性)
✅ 正确做法:alarmList.Count
📌 原因:数组用 .Length,List 用 .Count,两者不通用,写错了 VS 直接报红线,编译不过。
「学完本节,你掌握了:」
List<T> 是一种长度可动态变化的集合容器,用 <T> 指定存储类型,比数组更适合工厂中数量不固定的动态数据场景。你学会了用 .Add() 添加、.Remove() 删除、.Contains() 查找、.Count 统计,以及用 foreach 遍历整个列表。结合冲压压力案例,你也体验了如何用 List 筛选异常数据、输出报告。这些操作在后续的设备监控、报警管理、生产记录等模块里会反复用到,打好这个基础,后面的路会顺很多。
把今天的代码跑一遍,比看十遍更有用。
📖 本文是《C# 工业数字化应用开发专家》系列第 019 节
上一节:【数组:一维、多维与交错数组】
下一节:【Dictionary<K,V> 字典集合入门】
💬 你在工作中有没有遇到过"数据条数不固定、数组写死了不够用"的情况?
欢迎在评论区说说你的场景,也许下一篇案例就来自你的留言。
🔔 还没关注的同学记得点击关注,系列课程持续更新,学完这420节,从工厂小白到工业软件开发专家,我们一起走。
#工业数字化 #C#编程入门 #工厂工程师 #NET10 #工业软件开发


本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!