【C#基础知识 14】6. 集合 -- 6.1 List

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的优点
  1. 动态大小

    • List<T> 可以动态调整大小,无需预先指定大小。
    • 适合存储数量不确定的元素。
  2. 快速访问

    • 通过索引访问元素,访问速度非常快。
    • 时间复杂度为 O(1)。
  3. 内置方法

    • List<T> 提供了许多内置方法,如 AddRemoveContainsSortFind 等。
    • 提高了集合操作的便利性。
  4. 类型安全

    • List<T> 是泛型集合,确保存储的元素类型相同。
    • 避免了类型转换错误。
  5. 易于使用

    • List<T> 的使用简单直观,易于理解和管理。
    • 适合初学者学习和使用。
  6. 多维支持

    • 可以存储复杂的数据结构,如 List<List<T>> 表示二维列表。
6.1.4 List的缺点
  1. 插入和删除

    • 插入和删除元素需要移动其他元素,性能较差。
    • 时间复杂度为 O(n)。
  2. 内存开销

    • List<T> 在内部使用数组实现,当数组大小不足时会自动扩容,可能导致额外的内存开销。
  3. 线程不安全

    • List<T> 不是线程安全的,多线程环境下需要额外的同步机制。
    • 增加了线程安全的复杂性。
  4. 固定类型

    • List<T> 中的所有元素必须是相同类型。
    • 不能存储不同类型的数据。
  5. 复杂性增加

    • 对于复杂的操作,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> 是存储和操作动态数组的重要集合类,提供了动态大小和内置方法的优点,但需要注意其插入删除操作的性能开销和线程安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路飞VS草帽

感谢支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值