前言
在我们进行了入门,基础,核心的学习后,我们已经学了相当多的知识了,不知道你现在对比打开入门时候的你,进步了多少。是否也能自己写一点简单的程序来作为小成就炫耀一下呢?
博主给你留的小项目你是否都有认真去复刻或者改进呢?
这些问题的答案只有你自己清楚。
我们接下来要开始学习的,更多是数据结构以及一些深层架构的东西,至于算法这方面,博主只简单讲几个排序算法,至于图相关的或者说树相关的更深层的算法,就要看有没有时间给你们讲了。
进阶这一块,会让你对c#的理解更加深入,也能让你初步接触到一些难以理解的东西,就不想前面那些知识点,很泛用,理解起来很轻松了。
所以博主也会尽量讲的详细一些,让你们能更好地理解这些相关的知识点。
今天我们第一节的ArrayList,是数据结构,我们固定的讲法都是从本质,申明,讲到增删查改遍历,最后会进行一点知识点的补充。
那么话不多说,开始我们今天的学习。
本质
- ArrayList是C#封装好的类(你可以去里面看)
- ArrayList是object类型的数组
- ArrayList的内部有很多方法
申明
ArrayList array = new ArrayList();//注意要引用System.Collections命名空间
增删查改
博主希望你每个都能自己去尝试用一下,体会一下具体的效果。
- 增
array.Add()//什么都可以加,一个一个地加 array.Insert(1,"内容")//第一个参数是插入的位置,第二个参数是插入的内容 array.AddRange()//一堆一堆地加 -
删
array.Remove();//移除指定元素,从头找,找到就删除 array.RemoveAt();//移除指定位置的元素 array.Clear();//清空 -
查
array[];//得到具体指定的元素,应该很好理解 array.Contains("元素");//查看元素是否存在 array.IndexOf();//正向查找(从头开始找),返回的是位置,如果没有,则返回-1 array.LastIndexOf();//反向查找(从尾巴开始找),其余同正向查找 -
改
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遍历:使用迭代器,更简洁
- 装箱拆箱:表现为值类型和引用类型的转换,理解其性能影响。
还是那句话。
请期待我的下一篇博客!
期待您的关注与支持,感谢您对于佑梦游戏开发的关注!


7729

被折叠的 条评论
为什么被折叠?



