C#基础知识 6:集合
6.1 List
List 是C#中用于存储动态数组的集合类。List<T>
是泛型集合,可以存储相同类型的元素,并且可以根据需要动态调整大小。以下是关于 List<T>
的详细讲解,包括其优点、缺点以及代码示例。
6.1.1 List的基本概念
List<T> 是 System.Collections.Generic
命名空间中的一个泛型集合类,用于存储动态数组。List<T>
可以存储相同类型的元素,并且可以根据需要动态调整大小。
示例:
csharp
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// 声明并初始化一个 List<int>
List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
// 访问 List 中的元素
Console.WriteLine(numbers[0]); // 输出: 1
// 遍历 List
foreach (int number in numbers)
{
Console.WriteLine(number);
}
}
}
6.1.2 List的声明和初始化
声明List:
csharp
using System.Collections.Generic;
List<T> list = new List<T>();
初始化List:
csharp
using System.Collections.Generic;
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
示例:
csharp
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// 声明并初始化一个 List<int>
List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
// 使用集合初始化器
List<int> numbers2 = new List<int> { 1, 2, 3, 4, 5 };
// 访问 List 中的元素
Console.WriteLine(numbers[0]); // 输出: 1
Console.WriteLine(numbers2[3]); // 输出: 4
}
}
6.1.3 List的优点
-
动态大小:
List<T>
可以动态调整大小,无需预先指定大小。- 适合存储数量不确定的元素。
-
快速访问:
- 通过索引访问元素,访问速度非常快。
- 时间复杂度为 O(1)。
-
内置方法:
List<T>
提供了许多内置方法,如Add
,Remove
,Contains
,Sort
,Find
等。- 提高了集合操作的便利性。
-
类型安全:
List<T>
是泛型集合,确保存储的元素类型相同。- 避免了类型转换错误。
-
易于使用:
List<T>
的使用简单直观,易于理解和管理。- 适合初学者学习和使用。
-
多维支持:
- 可以存储复杂的数据结构,如
List<List<T>>
表示二维列表。
- 可以存储复杂的数据结构,如
6.1.4 List的缺点
-
插入和删除:
- 插入和删除元素需要移动其他元素,性能较差。
- 时间复杂度为 O(n)。
-
内存开销:
List<T>
在内部使用数组实现,当数组大小不足时会自动扩容,可能导致额外的内存开销。
-
线程不安全:
List<T>
不是线程安全的,多线程环境下需要额外的同步机制。- 增加了线程安全的复杂性。
-
固定类型:
List<T>
中的所有元素必须是相同类型。- 不能存储不同类型的数据。
-
复杂性增加:
- 对于复杂的操作,
List<T>
可能需要额外的代码来实现。 - 例如,排序、查找等操作需要手动实现或使用内置方法。
- 对于复杂的操作,
6.1.5 List的代码示例
以下是一些详细的代码示例,展示了如何声明、初始化和操作 List<T>
。
示例1:声明和初始化List
文件1:Program.cs
csharp
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// 声明并初始化一个 List<int>
List<int> numbers = new List<int>();
numbers.Add(1);
numbers.Add(2);
numbers.Add(3);
// 使用集合初始化器
List<int> numbers2 = new List<int> { 1, 2, 3, 4, 5 };
// 访问 List 中的元素
Console.WriteLine(numbers[0]); // 输出: 1
Console.WriteLine(numbers2[3]); // 输出: 4
}
}
示例2:遍历List
文件1:Program.cs
csharp
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
// 使用 for 循环遍历 List
for (int i = 0; i < numbers.Count; i++)
{
Console.WriteLine($"Element at index {i}: {numbers[i]}");
}
// 使用 foreach 循环遍历 List
foreach (int number in numbers)
{
Console.WriteLine($"Element: {number}");
}
}
}
示例3:List的常用方法
文件1:Program.cs
csharp
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
// 添加元素
numbers.Add(6);
Console.WriteLine("After Add:");
foreach (int number in numbers)
{
Console.Write(number + " ");
}
Console.WriteLine();
// 插入元素
numbers.Insert(2, 10);
Console.WriteLine("After Insert:");
foreach (int number in numbers)
{
Console.Write(number + " ");
}
Console.WriteLine();
// 删除元素
numbers.Remove(3);
Console.WriteLine("After Remove:");
foreach (int number in numbers)
{
Console.Write(number + " ");
}
Console.WriteLine();
// 删除指定索引的元素
numbers.RemoveAt(0);
Console.WriteLine("After RemoveAt:");
foreach (int number in numbers)
{
Console.Write(number + " ");
}
Console.WriteLine();
// 检查元素是否存在
bool contains = numbers.Contains(10);
Console.WriteLine($"Contains 10: {contains}"); // 输出: Contains 10: True
// 获取 List 的长度
int count = numbers.Count;
Console.WriteLine($"Count: {count}"); // 输出: Count: 4
// 清空 List
numbers.Clear();
Console.WriteLine("After Clear:");
foreach (int number in numbers)
{
Console.Write(number + " ");
}
Console.WriteLine();
}
}
示例4:List的排序
文件1:Program.cs
csharp
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
List<int> numbers = new List<int> { 5, 3, 8, 1, 2 };
// 排序 List
numbers.Sort();
// 输出排序后的 List
Console.WriteLine("Sorted List:");
foreach (int number in numbers)
{
Console.Write(number + " ");
}
Console.WriteLine();
}
}
示例5:List的查找
文件1:Program.cs
csharp
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
// 查找元素的索引
int index = numbers.IndexOf(3);
Console.WriteLine($"Index of 3: {index}"); // 输出: Index of 3: 2
// 查找不存在的元素
int indexNotFound = numbers.IndexOf(10);
Console.WriteLine($"Index of 10: {indexNotFound}"); // 输出: Index of 10: -1
// 查找满足条件的元素
int firstEven = numbers.Find(x => x % 2 == 0);
Console.WriteLine($"First even number: {firstEven}"); // 输出: First even number: 2
}
}
示例6:List的转换
文件1:Program.cs
csharp
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
// 将 List 转换为数组
int[] array = numbers.ToArray();
Console.WriteLine("Array:");
foreach (int number in array)
{
Console.Write(number + " ");
}
Console.WriteLine();
// 将数组转换为 List
List<int> numbers2 = new List<int>(array);
Console.WriteLine("List from Array:");
foreach (int number in numbers2)
{
Console.Write(number + " ");
}
Console.WriteLine();
}
}
示例7:List的多维支持
文件1:Program.cs
csharp
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// 声明并初始化一个二维 List
List<List<int>> matrix = new List<List<int>>
{
new List<int> { 1, 2, 3 },
new List<int> { 4, 5, 6 }
};
// 访问二维 List 中的元素
Console.WriteLine(matrix[0][0]); // 输出: 1
Console.WriteLine(matrix[1][2]); // 输出: 6
// 遍历二维 List
for (int i = 0; i < matrix.Count; i++)
{
for (int j = 0; j < matrix[i].Count; j++)
{
Console.Write(matrix[i][j] + " ");
}
Console.WriteLine();
}
}
}
示例8:List的性能优化
文件1:Program.cs
csharp
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
// 预分配容量以减少扩容次数
List<int> numbers = new List<int>(10);
// 添加元素
for (int i = 0; i < 10; i++)
{
numbers.Add(i + 1);
}
// 输出 List 中的元素
Console.WriteLine("List:");
foreach (int number in numbers)
{
Console.Write(number + " ");
}
Console.WriteLine();
// 检查容量
Console.WriteLine($"Capacity: {numbers.Capacity}"); // 输出: Capacity: 10
// 检查实际元素数量
Console.WriteLine($"Count: {numbers.Count}"); // 输出: Count: 10
}
}
通过以上详细讲解和代码示例,您可以更好地理解和使用C#中的 List<T>
。List<T>
是存储和操作动态数组的重要集合类,提供了动态大小和内置方法的优点,但需要注意其插入删除操作的性能开销和线程安全性。