C#中不使用List实现无限制添加电影的数组/向量解决方案(教学场景)
C#中不使用List实现无限制添加电影的数组/向量解决方案(教学场景)
嘿,同学!我完全懂你的需求——作为学生要练手基础数组操作,不能直接用自带的List,还得实现无限制添加电影的功能,对吧?咱们就从你现有的代码出发,一步步搞定这个问题。
你现在的代码用了一个固定长度1000的数组,这肯定会有上限,核心思路就是手动实现数组的动态扩容——简单说就是数组满了之后,咱自己造一个更大的数组,把旧数组里的内容搬过去,然后继续用新数组存新电影。
具体实现步骤
- 判断数组是否已满:每次添加电影前,检查当前已存的电影数量
movieCount是不是等于数组的长度,如果相等,说明数组已经装不下了,得扩容。 - 创建更大的新数组:常见的做法是把数组长度翻倍(比如从1000变成2000),这样扩容的效率更高;当然也可以固定增加某个数值(比如每次加500),教学场景下两种都可以尝试。
- 复制旧数组元素到新数组:可以用C#自带的
Array.Copy方法,也可以用for循环手动复制,后者更适合理解底层逻辑。 - 替换旧数组并添加新电影:把原来的数组变量指向新数组,然后把新电影放到数组的
movieCount位置,最后让movieCount加1。
完整代码示例
class Program { // 初始数组设小一点,方便测试扩容效果,你也可以改回1000 static Movie[] movieArray = new Movie[4]; static int movieCount = 0; // 自定义的添加电影方法 static void AddMovie(Movie newMovie) { // 检查数组是否已满 if (movieCount == movieArray.Length) { // 扩容:这里选择把数组长度翻倍,你也可以改成固定增量比如movieArray.Length + 500 Movie[] expandedArray = new Movie[movieArray.Length * 2]; // 方式1:用Array.Copy高效复制(推荐) Array.Copy(movieArray, expandedArray, movieCount); // 方式2:手动循环复制(教学场景更直观) // for (int i = 0; i < movieCount; i++) // { // expandedArray[i] = movieArray[i]; // } // 替换旧数组为扩容后的新数组 movieArray = expandedArray; } // 将新电影存入数组,然后计数加1 movieArray[movieCount] = newMovie; movieCount++; } // 假设你的Movie类是这样的(可以根据自己的需求修改) class Movie { public string Title { get; set; } public int ReleaseYear { get; set; } public Movie(string title, int releaseYear) { Title = title; ReleaseYear = releaseYear; } } // 测试用的Main方法 static void Main(string[] args) { // 连续添加电影,超过初始数组长度就会自动扩容 AddMovie(new Movie("星际穿越", 2014)); AddMovie(new Movie("盗梦空间", 2010)); AddMovie(new Movie("泰坦尼克号", 1997)); AddMovie(new Movie("阿凡达", 2009)); AddMovie(new Movie("蜘蛛侠:纵横宇宙", 2023)); // 这里触发第一次扩容 AddMovie(new Movie("奥本海默", 2023)); // 继续添加,没问题 // 输出所有电影验证 for (int i = 0; i < movieCount; i++) { Console.WriteLine($"{movieArray[i].Title} - {movieArray[i].ReleaseYear}"); } } }
关键知识点解释
- 这种实现其实就是模拟了C#中
List<T>的底层逻辑——List本质上就是一个会自动扩容的数组,咱们手动实现一遍,能更清楚它的工作原理,完全符合教学要求。 - 扩容时选择翻倍长度,是因为这种方式的均摊时间复杂度是O(1),比每次固定加长度的效率更高;不过教学里两种方式都可以尝试,理解逻辑最重要。
- 一定要保证
movieCount的准确性,它始终记录着数组中实际存放的电影数量,是咱们判断数组是否满、遍历数组的关键。
备注:内容来源于stack exchange,提问作者Niklas
相关产品推荐
相关产品推荐

