目录

C练习题List

C#练习题——List

一、任务一:建立一个整形List,为它添加10~1

实现目标:

(1)删除List中第五个元素

(2)遍历剩余元素并打印


二、代码解析

1. 创建列表


List<int> list1 = new List<int>();

(1)创建一个名为list1的整型列表

(2)List<int>是泛型集合,只能存储指定类型(此处为int)的元素

2. 添加元素


for (int i = 10; i > 0; i--)
{
    list1.Add(i);
}

(1)使用Add()方法向列表末尾添加元素

(2)循环从10递减到1,因此元素添加顺序为:10, 9, 8, …, 1

3. 移除元素


list1.RemoveAt(4);

(1)RemoveAt(4)移除索引位置为4的元素(即第5个元素,因为索引从0开始)

(2)在移除前,列表元素为:[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

索引4对应的元素是数字6

4. 遍历列表


foreach (int item in list1)
{
    Console.WriteLine(item);
}

(1)使用foreach循环遍历列表中的每个元素

(2)这是一种安全且高效的遍历方式


三、完整代码


using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace 进阶测试
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> list1 = new List<int>();
            for (int i = 10; i >0 ; i--)
            {
                list1.Add(i);
            }
            list1.RemoveAt(4);
            foreach (int item in list1)
            {
                Console.WriteLine(item);
            }
        }
    }
}

四、任务二:创建一个Monster基类,Boss和Gablin类继承它

实现目标:

(1)在怪物类的构造函数中,将其存储到一个怪物List中

(2)遍历列表可以让Boss和Gablin对象产生不同攻击


五、核心概念解析

1. 抽象类 (Abstract Class)


abstract class Monster
{
    public abstract void Attack(); // 抽象方法,无实现
}

作用:作为基类,定义通用接口但不能被实例化

特点:可以包含抽象方法和具体实现的方法

2. 多态性 (Polymorphism)


// 多态调用示例
Monster monster = new Boss();
monster.Attack(); // 实际调用Boss的Attack方法

实现方式:通过虚方法(virtual)和重写(override)

优点:提高代码的扩展性和可维护性

3. 静态成员 (Static Member)


public static List<Monster> list = new List<Monster>();

特点:所有实例共享同一个静态成员

用途:实现全局数据存储和共享

4. 集合操作


// 自动注册模式
public Monster()
{
    list.Add(this); // 构造函数中自动添加
}

设计模式:自注册模式(Self-registration pattern)

优点:简化对象管理,避免手动注册


六、完整代码


using System;
using System.Collections.Generic;

namespace MonsterManagementSystem
{
    /// <summary>
    /// 抽象怪物基类
    /// </summary>
    abstract class Monster
    {
        // 静态列表,自动记录所有创建的怪物实例
        public static List<Monster> list = new List<Monster>();
        
        /// <summary>
        /// 构造函数,自动将新创建的怪物添加到静态列表中
        /// </summary>
        public Monster()
        {
            list.Add(this);
            Console.WriteLine($"怪物已创建并添加到列表,当前总数:{list.Count}");
        }

        /// <summary>
        /// 显示所有怪物信息
        /// </summary>
        public void ShowAllMonsters()
        {
            Console.WriteLine("\n=== 所有怪物列表 ===");
            for (int i = 0; i < list.Count; i++)
            {
                // 使用GetType()获取实际类型信息
                Console.WriteLine($"{i + 1}. {list[i].GetType().Name}");
            }
            Console.WriteLine("====================\n");
        }

        /// <summary>
        /// 抽象攻击方法,由子类实现具体攻击行为
        /// </summary>
        public abstract void Attack();
    }

    /// <summary>
    /// Boss类 - 具体怪物类型
    /// </summary>
    class Boss : Monster
    {
        public override void Attack()
        {
            Console.WriteLine("Boss发动强力攻击!💥");
        }
    }

    /// <summary>
    /// Gablin类 - 具体怪物类型(哥布林)
    /// </summary>
    class Gablin : Monster
    {
        public override void Attack()
        {
            Console.WriteLine("Gablin进行快速攻击!⚔️");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("=== 怪物管理系统启动 ===\n");
            
            // 创建怪物实例
            Boss boss1 = new Boss();
            Gablin gablin1 = new Gablin();
            Boss boss2 = new Boss();
            Gablin gablin2 = new Gablin();

            Console.WriteLine("\n=== 怪物攻击演示 ===");
            // 多态性演示:通过基类引用调用子类方法
            boss1.Attack();
            boss2.Attack();
            gablin1.Attack();
            gablin2.Attack();

            Console.WriteLine("\n=== 显示所有怪物 ===");
            // 显示所有已创建的怪物
            boss1.ShowAllMonsters();

            // 额外演示:使用多态性遍历所有怪物
            Console.WriteLine("=== 所有怪物同时攻击 ===");
            foreach (Monster monster in Monster.list)
            {
                monster.Attack(); // 多态调用
            }

            Console.WriteLine("\n=== 程序结束 ===");
            Console.ReadKey();
        }
    }
}