You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 12:08:00