C#进阶(1) ArrayList

前言

在我们进行了入门,基础,核心的学习后,我们已经学了相当多的知识了,不知道你现在对比打开入门时候的你,进步了多少。是否也能自己写一点简单的程序来作为小成就炫耀一下呢?

博主给你留的小项目你是否都有认真去复刻或者改进呢?

这些问题的答案只有你自己清楚。

我们接下来要开始学习的,更多是数据结构以及一些深层架构的东西,至于算法这方面,博主只简单讲几个排序算法,至于图相关的或者说树相关的更深层的算法,就要看有没有时间给你们讲了。

进阶这一块,会让你对c#的理解更加深入,也能让你初步接触到一些难以理解的东西,就不想前面那些知识点,很泛用,理解起来很轻松了。

所以博主也会尽量讲的详细一些,让你们能更好地理解这些相关的知识点。

今天我们第一节的ArrayList,是数据结构,我们固定的讲法都是从本质,申明,讲到增删查改遍历,最后会进行一点知识点的补充。

那么话不多说,开始我们今天的学习。

本质

  • ArrayList是C#封装好的类(你可以去里面看)
  • ArrayList是object类型的数组
  • ArrayList的内部有很多方法

申明

ArrayList array = new ArrayList();//注意要引用System.Collections命名空间

 增删查改

博主希望你每个都能自己去尝试用一下,体会一下具体的效果。

  1. 增 
    array.Add()//什么都可以加,一个一个地加
    array.Insert(1,"内容")//第一个参数是插入的位置,第二个参数是插入的内容
    array.AddRange()//一堆一堆地加
  2. array.Remove();//移除指定元素,从头找,找到就删除
    array.RemoveAt();//移除指定位置的元素
    array.Clear();//清空
  3. array[];//得到具体指定的元素,应该很好理解
    array.Contains("元素");//查看元素是否存在
    array.IndexOf();//正向查找(从头开始找),返回的是位置,如果没有,则返回-1
    array.LastIndexOf();//反向查找(从尾巴开始找),其余同正向查找
  4. array[]=你要改的元素

 这里我也给你一个可以运行的代码,但是还是希望你尽量自己去敲一下,这样你的学习才更牢固一些。你可以跟着我这段代码一点一点敲,然后看每个方法的具体效果。

using System;
using System.Collections;

class ArrayListDemo
{
    static void Main()
    {
        // 创建一个ArrayList对象
        ArrayList array = new ArrayList();

        // 使用Add()方法逐个添加元素
        Console.WriteLine("使用 Add() 方法添加元素:");
        array.Add("苹果");
        array.Add("香蕉");
        array.Add("橙子");
        array.Add(123);
        array.Add(3.14);
        array.Add(true);
        PrintArrayList(array);

        // 使用Insert()方法在指定位置插入元素
        Console.WriteLine("\n使用 Insert(1, \"内容\") 方法插入元素:");
        array.Insert(1, "内容");
        PrintArrayList(array);

        // 使用AddRange()方法批量添加元素
        Console.WriteLine("\n使用 AddRange() 方法批量添加元素:");
        ArrayList newElements = new ArrayList();
        newElements.Add("草莓");
        newElements.Add("西瓜");
        array.AddRange(newElements);
        PrintArrayList(array);

        // 使用Remove()方法移除指定元素
        Console.WriteLine("\n使用 Remove() 方法移除元素:");
        array.Remove("内容");
        PrintArrayList(array);

        // 使用RemoveAt()方法移除指定位置的元素
        Console.WriteLine("\n使用 RemoveAt() 方法移除指定位置的元素:");
        array.RemoveAt(2);
        PrintArrayList(array);

        // 使用Contains()方法检查元素是否存在
        Console.WriteLine("\n使用 Contains() 方法检查元素是否存在:");
        Console.WriteLine("列表中是否包含\"香蕉\":" + array.Contains("香蕉"));
        Console.WriteLine("列表中是否包含\"葡萄\":" + array.Contains("葡萄"));

        // 使用IndexOf()方法正向查找元素位置
        Console.WriteLine("\n使用 IndexOf() 方法正向查找元素位置:");
        Console.WriteLine("\"香蕉\"的位置:" + array.IndexOf("香蕉"));
        Console.WriteLine("\"葡萄\"的位置:" + array.IndexOf("葡萄"));

        // 使用LastIndexOf()方法反向查找元素位置
        Console.WriteLine("\n使用 LastIndexOf() 方法反向查找元素位置:");
        array.Add("香蕉"); // 添加重复元素以便测试
        Console.WriteLine("\"香蕉\"的最后位置:" + array.LastIndexOf("香蕉"));
        PrintArrayList(array);

        // 使用索引器[]获取和修改元素
        Console.WriteLine("\n使用索引器[]获取和修改元素:");
        Console.WriteLine("索引为1的元素:" + array[1]);
        array[1] = "修改后的内容";
        Console.WriteLine("修改后索引为1的元素:" + array[1]);
        PrintArrayList(array);

        // 使用Clear()方法清空ArrayList
        Console.WriteLine("\n使用 Clear() 方法清空ArrayList:");
        array.Clear();
        Console.WriteLine("ArrayList是否为空:" + (array.Count == 0));
    }

    // 辅助方法:打印ArrayList中的所有元素,这个用了我们后面要讲的foreach
    static void PrintArrayList(ArrayList array)
    {
        Console.WriteLine("当前ArrayList内容:");
        foreach (var item in array)
        {
            Console.WriteLine($"  {item}");
        }
        Console.WriteLine($"元素数量:{array.Count}");
    }
}

遍历

在讲遍历之前,我们先看一段代码理解两个概念,长度Count(可以比喻成实际的液体长度)和容量Capacity(可以比喻成水瓶的长度)。

using System;
using System.Collections.Generic;

class CollectionDemo
{
    static void Main()
    {
        // 创建一个初始容量为3的List
        List<string> fruits = new List<string>(3);
        Console.WriteLine($"初始状态:");
        PrintInfo(fruits);

        // 添加元素,观察Count和Capacity的变化
        Console.WriteLine("\n=== 添加元素 ===");
        fruits.Add("苹果");
        PrintInfo(fruits);

        fruits.Add("香蕉");
        PrintInfo(fruits);

        fruits.Add("橙子");
        PrintInfo(fruits);

        // 添加第4个元素,触发容量自动增长
        Console.WriteLine("\n添加第4个元素,触发容量增长:");
        fruits.Add("草莓");
        PrintInfo(fruits);

        // 手动设置容量
        Console.WriteLine("\n=== 手动调整容量 ===");
        Console.WriteLine("设置容量为10:");
        fruits.Capacity = 10;
        PrintInfo(fruits);

        // 移除元素,观察Count变化但Capacity不变
        Console.WriteLine("\n移除一个元素:");
        fruits.Remove("香蕉");
        PrintInfo(fruits);

        // 清空元素,观察Count和Capacity的变化
        Console.WriteLine("\n清空所有元素:");
        fruits.Clear();
        PrintInfo(fruits);

        // TrimExcess方法:将容量调整为实际元素数量
        Console.WriteLine("\n调用TrimExcess()方法:");
        fruits.TrimExcess();
        PrintInfo(fruits);

        // 再次添加元素,观察容量变化
        Console.WriteLine("\n再次添加元素:");
        fruits.Add("西瓜");
        fruits.Add("葡萄");
        PrintInfo(fruits);
    }

    // 辅助方法:打印List的Count、Capacity和元素内容
    static void PrintInfo(List<string> list)
    {
        Console.WriteLine($"Count: {list.Count}, Capacity: {list.Capacity}");
        Console.Write("元素: ");
        if (list.Count == 0)
            Console.WriteLine("(空)");
        else
            Console.WriteLine(string.Join(", ", list));
        Console.WriteLine("-------------------");
    }
}

for遍历

for(int i=0;i<array.Count;i++)
{
    Console.WriteLine(array[i]);
}

foreach遍历(迭代器遍历)

  • 只能顺序访问元素,无法直接访问指定索引的元素。
  • 大多数情况下禁止修改集合结构(添加 / 删除元素),否则会抛出问题
  • 适用于简单遍历,代码更简洁,无需关心索引。
  • 由迭代器控制遍历逻辑,但可通过自定义迭代器实现特殊遍历顺序。
foreach(object item in array)
{
    Console.WriteLine(item);
}

 装箱拆箱

值类型存储为装箱,值类型对象取出来转换为拆箱。ArrayList尽量少用装箱拆箱。

  • ArrayList提供了便捷的动态存储能力,但由于其非类型安全和装箱拆箱的性能开销,建议在新项目中限制使用,更推荐使用泛型集合(这个要讲到后面你才能很好地理解)。
array[0]=i;//装箱
i=(int)array[0];//拆箱

总结

本节我们详细讲解了ArrayList的基本概念、申明方式、增删查改操作、遍历技巧(for与foreach)、装箱拆箱机制。

  • ArrayList的本质与特性
    • 支持存储不同类型的元素
    • 动态扩展容量
    • 操作相对简便,适合临时存储和快速操作
  • 操作方法
    • 增:Add、AddRange
    • 删:Remove、RemoveAt、Clear
    • 查:索引访问、Contains
    • 改:直接通过索引修改
  • 遍历技巧
    • for遍历:利用索引进行遍历
    • foreach遍历:使用迭代器,更简洁
  • 装箱拆箱:表现为值类型和引用类型的转换,理解其性能影响。

还是那句话。

请期待我的下一篇博客!

期待您的关注与支持,感谢您对于佑梦游戏开发的关注!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值