C#基礎篇(10)集合類之列表

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(截斷小數部分) 構造函數的隱…