C# 中的列表(List)详解

列表(List)概述

在C#中,List<T>是System.Collections.Generic命名空间中的一个泛型集合类,它提供了动态大小的数组功能,可以存储指定类型的元素。

列表的创建与初始化

// 创建一个空列表
List<int> numbers = new List<int>();
// 创建并初始化列表
List<string> names = new List<string>() { "Alice", "Bob", "Charlie" };
// 使用容量初始化(优化性能)
List<double> values = new List<double>(100); // 初始容量为100

常用功能函数

添加元素

List<int> list = new List<int>();
// 添加单个元素
list.Add(1);
// 添加多个元素
list.AddRange(new int[] { 2, 3, 4 });
// 在指定位置插入元素
list.Insert(1, 5); // 在索引1处插入5

删除元素

// 移除指定元素(第一个匹配项)
list.Remove(3);
// 移除指定位置的元素
list.RemoveAt(0);
// 移除所有满足条件的元素
list.RemoveAll(x => x > 10);
// 清空列表
list.Clear();

查询与访问

// 获取元素数量
int count = list.Count;
// 检查是否包含某元素
bool hasFive = list.Contains(5);
// 查找元素索引
int index = list.IndexOf(4); // 返回-1如果未找到
// 使用索引器访问元素
int first = list[0];
// 查找第一个匹配条件的元素
int firstEven = list.Find(x => x % 2 == 0);
// 查找所有匹配条件的元素
List<int> allEvens = list.FindAll(x => x % 2 == 0);

排序与操作

// 排序
list.Sort();
// 自定义排序
list.Sort((a, b) => b.CompareTo(a)); // 降序排序
// 反转列表
list.Reverse();
// 转换为数组
int[] array = list.ToArray();

遍历列表

// foreach循环
foreach (var item in list)
{Console.WriteLine(item);
}// for循环
for (int i = 0; i < list.Count; i++)
{Console.WriteLine(list[i]);
}

内部存储原理

  1. 动态数组实现​:List内部使用一个数组来存储元素,当元素数量超过当前数组容量时,会自动分配一个更大的数组并复制原有元素。

  2. 容量(Capacity)与数量(Count)​​:

    • Capacity:内部数组的大小
    • Count:实际存储的元素数量
    • 当Count达到Capacity时,Capacity会自动增长(通常是当前容量的2倍)
  3. 内存分配​:

    • 初始容量默认为0或4(取决于构造函数)
    • 扩容操作会导致内存重新分配和元素复制,这是相对昂贵的操作
    • 如果知道大致元素数量,预先设置Capacity可以提高性能
  4. 连续内存​:与数组类似,List的元素在内存中是连续存储的,这提供了良好的缓存局部性。

列表(List)与数组(Array)的区别

特性列表(List)数组(T[])
大小动态大小,自动扩展固定大小,创建后不能改变
内存管理自动管理内存,内部处理扩容需要手动管理
性能插入/删除可能触发扩容,稍慢固定大小,访问速度极快
功能方法提供丰富的方法(Add, Remove, Find等)基本功能,依赖Array类的静态方法
初始化可以动态添加元素创建时必须指定大小或初始化所有元素
内存开销有少量额外开销(管理Capacity等)开销最小
适用场景元素数量变化频繁的场景元素数量固定或性能要求极高的场景

性能考虑

  1. 预分配容量​:如果知道列表的大致大小,预先设置Capacity可以避免多次扩容。

    List<int> list = new List<int>(1000); // 预分配1000个元素的容量
  2. 批量操作​:使用AddRange比多次调用Add更高效。

  3. 频繁插入/删除​:如果在列表中间频繁插入或删除元素,考虑使用LinkedList可能更合适。

  4. 只读场景​:如果集合创建后不再修改,使用数组或ReadOnlyCollection可能更合适。

总结

C#中的List提供了灵活、强大的动态集合功能,它在大多数情况下可以替代数组,并提供更丰富的操作方法。理解其内部实现原理有助于编写更高效的代码,特别是在处理大量数据时。根据具体场景选择合适的数据结构(数组、列表、链表等)是编写高效C#代码的关键。

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

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

相关文章

SpringBoot订单模块核心接口设计与实现

目录 一、 管理端接口实现 (后台管理系统) 一、订单搜索 (高权重 - 核心管理功能) 1.Controller (OrderController): 2.Service (OrderService): 3.ServiceImpl (OrderServiceImpl): 1.使用MyBatis分页插件PageHelper 2.基础数据查询 4.Mapper (OrderMapper): 5.Mapper …

EXCEL链接模板无法自动链接到PowerBI?试试这个方法

在使用EXCEL链接模板连接PowerBI时&#xff0c;你有没有遇到如图所示的提示呢&#xff1a;下面我来分享一下&#xff0c;出现弹框的原因及解决方法&#xff1a;首先我们先看一下这个英文翻译&#xff0c;意思就是说&#xff0c;我们只能使一个PowerBI文件处于打开的状态&#x…

最新全开源礼品代发系统源码/电商快递代发/一件代发系统

简介&#xff1a;最新全开源礼品代发系统源码/电商快递代发/一件代发系统测试环境&#xff1a;Nginx PHP7.2 MySQL5.6图片&#xff1a;

Android 事件分发机制深度解析

一、事件分发机制核心概念1. 事件分发三要素要素作用关键方法事件(Event)用户触摸动作的封装MotionEvent分发者负责将事件传递给下级dispatchTouchEvent()拦截者决定是否截断事件传递&#xff08;仅ViewGroup&#xff09;onInterceptTouchEvent()消费者最终处理事件的组件onTou…

从威胁检测需求看两类安全监测平台差异

在网络安全领域&#xff0c;针对不同场景的威胁检测需求&#xff0c;衍生处了多种技术架构的安全监测平台。尽管它们的目标均为“识别异常行为、阻断潜在威胁”&#xff0c;但根据其核心引擎的配置的技术侧重点&#xff0c;可大致分为两类&#xff1a;聚焦基础入侵检测的平台与…

useContext:React 跨组件数据共享的优雅解决方案

关键点 useContext&#xff1a;React 提供的 Hook&#xff0c;用于在组件树中共享全局状态&#xff0c;简化跨组件数据传递。应用场景&#xff1a;主题切换、用户认证、语言设置和全局配置管理。实现方式&#xff1a;结合 createContext 和 useContext&#xff0c;实现灵活的状…

20250706-8-Docker快速入门(下)-Dockerfile介绍与基本使用_笔记

一、Dockerfile构建镜像1. Dockerfile概述&#xfeff;定义&#xff1a;Dockerfile是一个用于自动构建镜像的文本文件&#xff0c;由一条条指令组成工作原理&#xff1a;指令逐步执行&#xff0c;每个指令完成不同功能典型指令示例&#xff1a;FROM centos:latest&#xff1a;基…

Git系列--3.分支管理

目录 一、理解分支 1.1图示 1.2 打印仓库下有哪些分支 1.3创建分支 1.4HEAD与切换分支 1.5合并分支 1.6流程图理解 二、删除分支 ​ 三、合并分支冲突 3.1.问题导入 3.2.解决 3.3合并图示 四、合并模式 4.1合并​编辑 4.2变基 五、bug分支 5.1背景建立 5.2解决步骤 5.2.1…

Vue.js TDD开发深度指南:工具链配置与精细化测试策略

“TDD不是测试优先的开发&#xff0c;而是设计优先的开发。” —— Robert C. Martin 引言 在Vue.js项目中实施测试驱动开发&#xff08;TDD&#xff09;是构建健壮应用的关键路径。但许多开发者在实践中常遇到&#xff1a; 工具链配置复杂导致放弃不同类型组件测试策略混淆测…

基于物联网的智能家居控制系统设计与实现

标题:基于物联网的智能家居控制系统设计与实现内容:1.摘要 随着物联网技术的飞速发展&#xff0c;智能家居逐渐成为人们关注的焦点。本文旨在设计并实现一个基于物联网的智能家居控制系统&#xff0c;以提高家居的智能化水平和用户的生活便利性。通过采用先进的传感器技术、通信…

Vue 中使用 Cesium 实现可拖拽点标记及坐标实时显示功能

在 Cesium 地图开发中&#xff0c;实现点标记的拖拽交互并实时显示坐标信息是一个常见的需求。本文将详细介绍如何在 Vue 框架中使用 Cesium 的 Primitive 方式创建点标记&#xff0c;并实现拖拽功能及坐标提示框跟随效果。先看效果图功能实现概述我们将实现的功能包括&#xf…

HTML 插件:构建网页的强大工具

HTML 插件:构建网页的强大工具 引言 HTML 插件是网页设计中不可或缺的一部分,它们为网页增添了丰富的交互性和动态效果。本文将深入探讨 HTML 插件的概念、类型、应用及其在网页开发中的重要性。 什么是 HTML 插件? HTML 插件,也称为 HTML 组件或 HTML 控件,是指嵌入到…

NeRF、3DGS、2DGS下三维重建相关方法介绍及以及在实景三维领域的最新实践

一、引言 在计算机视觉与图形学领域&#xff0c;三维重建技术正经历从传统几何建模向智能化神经表征的范式转变。近年来&#xff0c;随着深度学习算法的迭代、传感器技术的进步及计算硬件的升级&#xff0c;以神经辐射场&#xff08;NeRF&#xff09;和高斯泼溅&#xff08;2D…

rt thread studio 和 KEIL对于使用rt thread 的中间件和组件,哪个更方便

下面我从中间件/组件集成和开发体验两个角度&#xff0c;详细对比 RT-Thread Studio 和 Keil MDK 的便利性&#xff1a;1. 中间件和组件集成 RT-Thread Studio 集成RT-Thread生态&#xff1a;内置RT-Thread的包管理器&#xff08;RT-Thread Package Manager&#xff09;&#x…

Spring Boot 项目开发实战:入门应用部分原理示例讲解

前言Spring Boot 作为当前 Java 开发领域最流行的框架之一&#xff0c;以其 "约定优于配置" 的理念极大简化了企业级应用的开发流程。本文将基于《Spring Boot 项目开发教程&#xff08;慕课版&#xff09;》中的资产管理系统项目&#xff0c;深入解析 Spring Boot 的…

ByteBrain x 清华 VLDB25|时序多模态大语言模型 ChatTS

资料来源&#xff1a;火山引擎-开发者社区 近年来&#xff0c;多模态大语言模型&#xff08;MLLM&#xff09;发展迅速&#xff0c;并在图像、视频、音频等领域取得了突破性成果。然而&#xff0c;相较于这些研究较为成熟的模态&#xff0c;时间序列这一类型的数据与大模型结合…

WPF学习笔记(25)MVVM框架与项目实例

MVVM框架与项目实例一、MVVM框架1. 概述2. 核心组件与优势一、MVVM项目1.普通项目2. MVVM架构3. MVVM项目实例1. 项目准备2. LoginViewModel与Login2. MainWindowViewModel4. MVVM项目优化1. BaseViewModel2. RealyCommand3. 效果展示总结一、MVVM框架 1. 概述 官方文档&…

MySQL实操

## 基于MySQL#先启动MySQL服务#第一次登录[rootlocalhost ~]# mysql -uroot -P3306#密码登录[rootlocalhost ~]# mysql -uroot -pEnter password: Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 9Server version: 8.0.41 Source dist…

ez_rust_writeup

一道简单的[[rust逆向]] #rust逆向 #位运算 题目信息 文件名&#xff1a;ezrust.exe 题目附件&#xff1a;https://wwfj.lanzoul.com/iczMR30k5j4h 密码:bueq 题目分析 1. 初步分析 这是一道Rust编写的逆向题目。通过IDA分析可以看到&#xff0c;这是一个典型的flag验证程序。 …

【QT】-隐式转换 explicit用法

通俗易懂的解释:隐式转换 vs 显式转换 什么是隐式转换? 隐式转换就是编译器偷偷帮你做的类型转换,你甚至都没意识到它发生了。 例子: cpp 运行 double x = 5; // 隐式:int → double(5 变成 5.0) int y = x * 2.5; // 隐式:double → int(截断小数部分) 构造函数的隐…