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]);
}
內部存儲原理
?動態數組實現?:List內部使用一個數組來存儲元素,當元素數量超過當前數組容量時,會自動分配一個更大的數組并復制原有元素。
?容量(Capacity)與數量(Count)??:
- Capacity:內部數組的大小
- Count:實際存儲的元素數量
- 當Count達到Capacity時,Capacity會自動增長(通常是當前容量的2倍)
?內存分配?:
- 初始容量默認為0或4(取決于構造函數)
- 擴容操作會導致內存重新分配和元素復制,這是相對昂貴的操作
- 如果知道大致元素數量,預先設置Capacity可以提高性能
?連續內存?:與數組類似,List的元素在內存中是連續存儲的,這提供了良好的緩存局部性。
列表(List)與數組(Array)的區別
特性 | 列表(List) | 數組(T[]) |
---|---|---|
大小 | 動態大小,自動擴展 | 固定大小,創建后不能改變 |
內存管理 | 自動管理內存,內部處理擴容 | 需要手動管理 |
性能 | 插入/刪除可能觸發擴容,稍慢 | 固定大小,訪問速度極快 |
功能方法 | 提供豐富的方法(Add, Remove, Find等) | 基本功能,依賴Array類的靜態方法 |
初始化 | 可以動態添加元素 | 創建時必須指定大小或初始化所有元素 |
內存開銷 | 有少量額外開銷(管理Capacity等) | 開銷最小 |
適用場景 | 元素數量變化頻繁的場景 | 元素數量固定或性能要求極高的場景 |
性能考慮
?預分配容量?:如果知道列表的大致大小,預先設置Capacity可以避免多次擴容。
List<int> list = new List<int>(1000); // 預分配1000個元素的容量
?批量操作?:使用AddRange比多次調用Add更高效。
?頻繁插入/刪除?:如果在列表中間頻繁插入或刪除元素,考慮使用LinkedList可能更合適。
?只讀場景?:如果集合創建后不再修改,使用數組或ReadOnlyCollection可能更合適。
總結
C#中的List提供了靈活、強大的動態集合功能,它在大多數情況下可以替代數組,并提供更豐富的操作方法。理解其內部實現原理有助于編寫更高效的代碼,特別是在處理大量數據時。根據具體場景選擇合適的數據結構(數組、列表、鏈表等)是編寫高效C#代碼的關鍵。