ListT​ 学习笔记

news/2025/11/1 13:57:44/文章来源:https://www.cnblogs.com/LunaNorth/p/19183264

一、基础概念与用法

1.1 什么是 List<T>

List<T> 是 C# 中 泛型集合类,位于 System.Collections.Generic 命名空间下。它表示一个可动态调整大小的强类型对象列表,是数组的“智能升级版”。

  • 优点

    • 自动扩容,无需预先指定长度
    • 类型安全(编译时检查,避免装箱/拆箱)
    • 提供丰富的操作方法(增删改查等)
  • 对比传统数组

    特性 数组 (T[]) List<T>
    大小是否固定 否(动态扩容)
    类型安全性
    是否支持泛型 否(但元素类型固定)
    性能(访问速度) 极快(连续内存) 快(底层仍是数组)
    功能丰富度 高(内置大量方法)

💡 提示List<T> 底层使用数组实现,当容量不足时会自动创建更大的新数组并复制元素。


1.2 如何定义和初始化?

using System;
using System.Collections.Generic;// 方式1:声明后初始化
List<string> names = new List<string>();// 方式2:声明时初始化(推荐)
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };// 方式3:使用 var(类型推断)
var fruits = new List<string> { "Apple", "Banana", "Cherry" };

⚠️ 注意:必须引入 using System.Collections.Generic;,否则编译报错。


1.3 常用方法与属性(附示例)

🔹 添加元素

var colors = new List<string>();
colors.Add("Red");        // 添加单个元素
colors.AddRange(new[] { "Green", "Blue" }); // 添加多个

🔹 访问元素

string first = colors[0];      // 索引访问(从0开始)
int count = colors.Count;      // 元素个数(注意不是 Length!)

🔹 修改元素

colors[0] = "Pink"; // 直接通过索引赋值

🔹 删除元素

colors.Remove("Green");     // 删除第一个匹配项
colors.RemoveAt(0);         // 按索引删除
colors.Clear();             // 清空所有元素

🔹 查找与判断

bool hasBlue = colors.Contains("Blue"); // 是否包含
int index = colors.IndexOf("Red");      // 返回首次出现的索引,未找到返回 -1

🔹 遍历列表

// foreach(推荐)
foreach (string color in colors)
{Console.WriteLine(color);
}// for 循环(需要索引时使用)
for (int i = 0; i < colors.Count; i++)
{Console.WriteLine($"{i}: {colors[i]}");
}

🔹 其他实用方法

方法 说明
Insert(index, item) 在指定位置插入元素
Sort() 对列表排序(要求元素可比较)
Reverse() 反转列表顺序
ToArray() 转换为数组
Find(predicate) 查找满足条件的第一个元素

示例:查找大于3的数字

var nums = new List<int> { 1, 5, 3, 8, 2 };
int firstBig = nums.Find(x => x > 3); // 结果:5

二、进阶知识点

2.1 List<T> 与其他集合的区别

集合类型 是否泛型 是否有序 是否允许重复 底层结构 适用场景
List<T> 动态数组 需要频繁访问、顺序存储
Dictionary<TKey, TValue> ❌(按键无序) 键唯一 哈希表 快速键值查找
HashSet<T> 哈希集 去重、快速存在判断
ArrayList object数组 已淘汰,避免使用

🚫 重要提醒ArrayList 是非泛型集合,存储 object,存在性能损耗和类型安全风险,在现代 C# 中应完全避免使用


2.2 性能特点

  • 访问元素:O(1) —— 和数组一样快(通过索引直接定位)
  • 尾部添加:平均 O(1),最坏 O(n)(扩容时需复制)
  • 中间插入/删除:O(n) —— 需移动后续元素
  • 查找(按值) :O(n) —— 需遍历

优化建议

  • 如果知道大致元素数量,初始化时指定容量可避免多次扩容:

    var list = new List<int>(1000); // 预分配容量
    

2.3 线程安全性

List<T> 不是线程安全的
在多线程环境下同时读写会导致 未定义行为(如数据丢失、异常)。

解决方案

  • 使用 lock 手动加锁
  • 使用线程安全集合:ConcurrentBag<T>ConcurrentQueue<T> 等(位于 System.Collections.Concurrent
private static readonly object _lock = new object();
lock (_lock)
{myList.Add(item);
}

⚠️ 不要在高并发场景下直接使用 List<T>


2.4 泛型约束与自定义类型

List<T> 支持任意类型,包括自定义类:

public class Person
{public string Name { get; set; }public int Age { get; set; }
}var people = new List<Person>
{new Person { Name = "Alice", Age = 30 },new Person { Name = "Bob", Age = 25 }
};// 排序示例(按年龄)
people.Sort((p1, p2) => p1.Age.CompareTo(p2.Age));

三、实际工作中的使用场景(含解释)

场景 1:批量处理用户输入数据

解释:在 Web 表单或控制台程序中,用户可能提交多个条目(如购物车商品、学生名单),List<T> 可动态接收并处理这些数据。

// 示例:收集用户输入的邮箱列表
var emails = new List<string>();
while (true)
{Console.Write("请输入邮箱(输入 quit 退出): ");string input = Console.ReadLine();if (input == "quit") break;emails.Add(input);
}
// 后续可批量验证、发送邮件等

场景 2:API 返回结果封装

解释:Web API 或服务接口常返回一组数据(如订单列表、文章列表),使用 List<T> 作为返回类型是最常见做法。

[HttpGet]
public List<Product> GetProducts()
{return _productService.GetAll(); // 返回产品列表
}

前端接收到的是结构清晰、类型明确的 JSON 数组。


场景 3:日志记录与错误收集

解释:在批处理任务中,可能产生多个警告或错误信息,用 List<string>List<ErrorInfo> 收集后统一处理。

var errors = new List<string>();
foreach (var file in files)
{try { ProcessFile(file); }catch (Exception ex){errors.Add($"处理 {file} 失败: {ex.Message}");}
}
if (errors.Any())
{SendAlertEmail(errors); // 发送汇总错误报告
}

场景 4:缓存临时计算结果

解释:某些算法(如递归、搜索)会产生中间结果,用 List<T> 缓存可避免重复计算,提升性能。

// 斐波那契数列缓存(简化版)
var fibCache = new List<long> { 0, 1 };
for (int i = 2; i <= n; i++)
{fibCache.Add(fibCache[i - 1] + fibCache[i - 2]);
}
return fibCache[n];

场景 5:UI 数据绑定(WPF / WinForms)

解释:在桌面应用中,ListBoxDataGridView 等控件常绑定到 List<T>,实现动态数据显示。

// WPF 示例
public partial class MainWindow : Window
{public MainWindow(){InitializeComponent();var items = new List<string> { "Item1", "Item2", "Item3" };MyListBox.ItemsSource = items; // 绑定到 ListBox}
}

💡 结合 ObservableCollection<T> 可实现自动 UI 更新(进阶内容)。


总结

维度 关键点
核心优势 动态扩容、类型安全、方法丰富
使用原则 优先于数组(除非大小固定且追求极致性能);绝不使用 ArrayList
注意事项 非线程安全;中间插入/删除效率低;合理预设容量可提升性能
典型场景 数据收集、API 返回、日志记录、缓存、UI 绑定

🌟 一句话记住
当你需要一个“能自动长大、类型明确、操作方便”的列表时,****List<T> 就是你最好的朋友!


📚 延伸建议

  • 学完 List<T> 后,可继续学习 Dictionary<TKey, TValue>(键值对场景)和 HashSet<T>(去重场景)
  • 实践:尝试用 List<T> 实现一个简单的待办事项(Todo List)控制台程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/952796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年ChronoEdit:基于时间推理的图像编辑与世界模拟完整指南

2025年ChronoEdit:基于时间推理的图像编辑与世界模拟完整指南ChronoEdit: NVIDIA开发的新型图像编辑框架,将图像编辑视为视频生成任务,以确保物理一致性和时间连贯性。🎯 核心要点 (TL;DR)ChronoEdit:NVIDIA开发…

HTTP 与 SOCKS5 代理协议:企业级选型指南与工程化实践 - Smart

面向企业网络与数据团队的工程化、可落地的代理协议选型与治理指南。核心思路:按流量特征选协议,用多协议网关统一出站,以托管网络降低复杂度,最终实现稳定吞吐、可预测时延与合规落地。[2][1] 一、核心定位与结论…

Zerto 10.8 发布 - 适用于本地、混合和多云环境的灾难恢复和数据保护

Zerto 10.8 发布 - 适用于本地、混合和多云环境的灾难恢复和数据保护Zerto 10.8 发布 - 适用于本地、混合和多云环境的灾难恢复和数据保护 Data Protection & Mobility for On-Premises and Cloud 请访问原文链接:…

bclinux镜像下载iso镜像文件下载bclinux iso镜像文件下载

bclinux镜像下载iso镜像文件下载bclinux iso镜像文件下载 下载地址: bclinux_iso 👍

2025年11月专机成套设备品牌推荐榜:实力厂家综合对比分析

在制造业转型升级的背景下,专机成套设备作为生产自动化的核心装备,正受到越来越多企业的关注。根据国家统计局数据显示,2024年我国装备制造业增加值同比增长7.5%,其中专用设备制造业表现尤为突出。作为企业用户,在…

2025年11月打印纸品牌推荐评测:从用户反馈看厂家综合实力

在日常办公与商业运营中,打印纸作为基础耗材直接影响工作效率与专业形象。根据国家印刷行业协会2024年发布的办公耗材使用调研报告,超过73%的企业在采购打印纸时面临品质稳定性、供应链可靠性及成本控制三大核心痛点…

2025年11月专机成套设备供应厂家榜:专业品牌深度评测与推荐

在制造业转型升级的背景下,专机成套设备作为实现自动化、智能化生产的关键装备,正受到越来越多企业的关注。根据中国机床工具工业协会发布的数据显示,2024年我国数控机床市场规模已达3000亿元,其中专机成套设备占比…

2025年11月专机成套设备推荐评测:五家口碑好工厂详细分析

作为工业生产领域的核心装备,专机成套设备的选择往往关系到整个生产线的运行效率与产品质量。2025年,随着制造业智能化转型的深入推进,专机成套设备市场需求持续增长。根据行业权威数据显示,今年前三个季度,我国专…

Java 开发者的 AI 转型不用 “从头学”:2-3 周落地商用产品,你的技术栈完全够用

Java 开发者的 AI 转型不用 “从头学”:2-3 周落地商用产品,你的技术栈完全够用面对 AI 浪潮,不少 Java 开发者都会陷入这样的纠结:手里攥着多年打磨的 SpringBoot、JBolt 技术经验,却总听说 “做 AI 要学新框架、…

2025年11月比较好的专机成套设备厂家排名榜:性能对比与选择建议

在工业制造领域不断升级的今天,专机成套设备作为定制化生产的核心装备,正受到越来越多企业的关注。2025年,随着智能制造和产业升级的深入推进,专机成套设备市场需求持续增长。许多生产企业负责人在设备选型时面临诸…

Java 团队搞 AI 开发难?JBoltAI 框架手把手教你快速落地企业级 AI 应用

Java 团队搞 AI 开发难?JBoltAI 框架手把手教你快速落地企业级 AI 应用提到 “Java 团队做 AI 开发”,不少技术负责人都会有同感:深耕多年的 Java 技术栈(Spring、MyBatis、JBolt)用得炉火纯青,可一碰到大模型对…

2025年11月专机成套设备推荐榜单:五家实力厂家综合对比分析

对于许多制造业企业而言,选择一套合适的专机成套设备是提升生产效率、保障产品质量的关键决策。无论是新建生产线还是对现有设备进行升级换代,企业决策者通常面临着技术门槛高、信息不对称、市场选择繁杂等挑战。他们…

Java 团队做 AI 应用怕踩坑?JBoltAI 有工单服务 + 案例库,开发全程有保障

Java 团队做 AI 应用怕踩坑?JBoltAI 有工单服务 + 案例库,开发全程有保障不少 Java 技术团队最近都陷入这样的困境:明明知道 AI 能提升业务效率,想开发智能报销、生产报表分析这类应用,可一动手就处处碰壁 —— 懂…

2025年11月数控铣床生产厂家排行:专业机构权威数据对比指南

作为机械加工领域的核心设备,数控铣床的选择直接影响生产效率和产品质量。2025年制造业数字化转型加速,企业对高精度、高效率加工设备的需求持续增长。根据中国机床工具工业协会发布的数据,今年前三季度数控机床市场…

2025年深度解析与推荐:福田欧曼重卡的多维价值评估

引言:本文将从产品技术创新的核心维度出发,为读者提供一个有针对性的客观参考。福田欧曼重卡作为中国中高端重卡领域的代表性品牌,其技术发展路径与产品迭代逻辑是观察行业趋势的重要窗口。 背景与概况:欧曼重卡是…

2025年推荐福田欧曼重卡:从技术驱动视角解析其市场竞争力与潜在风险

本文将从技术驱动这一核心维度出发,为读者提供一个有针对性的客观参考。福田欧曼重卡是北汽福田汽车旗下重卡品牌,起步即与世界同步。自2001年面世以来,欧曼始终坚持市场与客户导向,秉承技术驱动引领行业创新,历经…

2025年11月新能源重卡实力榜:主流品牌场景适配性与服务对比

随着双碳战略的持续推进,物流行业对新能源重卡的需求呈现快速增长态势。作为行业从业者,您可能正在为车队更新或业务拓展寻找可靠的新能源重卡解决方案。当前新能源重卡市场正处于技术快速迭代期,政策扶持与市场需求…

自然语言交互 + 智能决策!JBoltAI 框架让 Java AI 应用更懂业务需求

自然语言交互 + 智能决策!JBoltAI 框架让 Java AI 应用更懂业务需求一、自然语言交互:让业务需求直达系统核心(一)语义理解引擎:从指令解析到意图捕捉JBoltAI 的语义理解引擎打破了这种传统的交互模式,让用户能够…

2025年深度解析与推荐:福田欧曼重卡市场竞争力多维透视

引言:本文将从市场竞争力的核心维度出发,为读者提供一个有针对性的客观参考。福田欧曼重卡作为中国中高端重卡市场的关键参与者,其市场表现与战略布局值得深入探讨。 背景与概况:欧曼重卡是北汽福田汽车旗下重卡品…

2025年11月新能源重卡推荐榜单:权威对比与综合评测分析

随着国家双碳战略的深入推进,新能源重卡市场正迎来快速发展期。作为物流运输行业的核心装备,新能源重卡的选择直接关系到运营效率与成本控制。本文基于国家相关部门发布的行业标准文件、官方公布的资质认证信息、第三…