8.List

8.常用泛型数据结构类-List


8.1 知识点

List的本质

List是一个C#为我们封装好的类,它的本质是一个可变类型的泛型数组,List类帮助我们实现了很多方法,比如泛型数组的增删查改。

List的申明

需要引用命名空间 using System.Collections.Generic

List<int> list1 = new List<int>();
List<string> list2 = new List<string>();
List<bool> list3 = new List<bool>();
List<int> list1 = new List<int> { 1, 2, 3, 4, 5 };
List<string> list2 = new List<string> { "apple", "banana", "orange" };
List<bool> list3 = new List<bool> { true, false, true };

List的增删查改和遍历

当前list1

{}

Add方法:直接在尾部添加元素。

list1.Add(0);
list1.Add(1);
list1.Add(2);
list1.Add(3);
list1.Add(4);

list2.Add("123");

AddRange方法:把其他相同的类型的List的所有元素拼接到尾部。

List<string> listStr = new List<string>();
listStr.Add("123");
list2.AddRange(listStr);

Insert方法:在指定位置插入元素。

list1.Insert(0, 999);
Console.WriteLine(list1[0]); // 999

当前list1

{ 999, 0, 1, 2, 3, 4 }

当前list1

{ 999, 0, 1, 2, 3, 4 }

Remove方法:移除指定元素。

list1.Remove(1);

RemoveAt方法:移除指定位置的元素。

list1.RemoveAt(0);

Clear方法:清空。

// list1.Clear(); // 方便后面演示,注释

当前list1

{ 0, 2, 3, 4 }

当前list1

{ 0, 2, 3, 4 }

List[x]索引器get:得到指定位置的元素。

Console.WriteLine(list1[0]); // 0

Contains方法:查看元素是否存在。

if (list1.Contains(2))
{
    Console.WriteLine("存在元素 2"); // 存在元素 2
}

IndexOf方法:正向查找元素位置,找到返回位置,找不到返回-1。

int index = list1.IndexOf(5);
Console.WriteLine(index); // -1

LastIndexOf方法:反向查找元素位置,找到返回位置,找不到返回-1。

index = list1.LastIndexOf(2);
Console.WriteLine(index); // 1

当前list1

{ 0, 2, 3, 4 }

List[x] = xx索引器set:修改指定位置的元素。

Console.WriteLine(list1[0]); // 0
list1[0] = 99;
Console.WriteLine(list1[0]); // 99

当前list1

{ 99, 2, 3, 4 }

遍历

当前list1

{ 99, 2, 3, 4 }

Count属性:返回List长度。

Console.WriteLine(list1.Count); // 4

Capacity属性:返回List容量。

// 容量的目的是避免产生垃圾
Console.WriteLine(list1.Capacity); // 8

for循环遍历

for (int i = 0; i < list1.Count; i++)
{
    Console.WriteLine(list1[i]);
    // 99
    // 2
    // 3
    // 4
}

foreach遍历

foreach (int item in list1)
{
    Console.WriteLine(item);
    // 99
    // 2
    // 3
    // 4
}

当前list1

{ 99, 2, 3, 4 }

8.2 知识点代码

using System;
using System.Collections.Generic;

namespace Lesson07_List
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("List");

            #region 知识点一 List的本质
            //List是一个C#为我们封装好的类,
            //它的本质是一个可变类型的泛型数组,
            //List类帮助我们实现了很多方法,
            //比如泛型数组的增删查改
            #endregion

            #region 知识点二 List的申明
            //需要引用命名空间
            //using System.Collections.Generic
            List<int> list1 = new List<int>();
            List<string> list2 = new List<string>();
            List<bool> list3 = new List<bool>();
            #endregion

            #region 知识点三  List的增删查改和遍历

            #region 增

            //当前list1 {}

            //Add方法 直接尾部添加元素
            list1.Add(0);
            list1.Add(1);
            list1.Add(2);
            list1.Add(3);
            list1.Add(4);

            list2.Add("123");

            //AddRange方法 把其他相同的类型的List的所有元素拼接到尾部
            List<string> listStr = new List<string>();
            listStr.Add("123");
            list2.AddRange(listStr);

            //Insert方法 在指定位置插入元素
            list1.Insert(0, 999);
            Console.WriteLine(list1[0]);//999

            //当前list1 {999,0,1,2,3,4}
            #endregion

            #region 删

            //当前list1 {999,,0,1,2,3,4}

            //Remove方法 移除指定元素
            list1.Remove(1);

            //RemoveAt方法 移除指定位置的元素
            list1.RemoveAt(0);

            //Clear方法 清空
            //list1.Clear();//方便后面演示 注释

            //当前list1 {0,2,3,4}

            #endregion

            #region 查

            //当前list1 {0,2,3,4}

            //List[x] 得到指定位置的元素
            Console.WriteLine(list1[0]);//0

            //Contains方法 查看元素是否存在
            if (list1.Contains(2))
            {
                Console.WriteLine("存在元素 2");//存在元素 2
            }

            //IndexOf方法 正向查找元素位置 找到返回位置 找不到 返回-1
            int index = list1.IndexOf(5);
            Console.WriteLine(index);//-1

            //LastIndexOf方法 反向查找元素位置 找到返回位置 找不到 返回-1
            index = list1.LastIndexOf(2);
            Console.WriteLine(index);//1

            //当前list1 {0,2,3,4}

            #endregion

            #region 改

            //当前list1 {0,2,3,4}

            //List[x] = xx; 修改指定位置的元素
            Console.WriteLine(list1[0]);//0
            list1[0] = 99;
            Console.WriteLine(list1[0]);//99

            //当前list1 {99,2,3,4}

            #endregion

            #region 遍历

            //当前list1 {99,2,3,4}

            //Count属性 返回List长度
            Console.WriteLine(list1.Count);//4

            //Capacity属性 返回List容量
            //容量的目的是避免产生垃圾
            Console.WriteLine(list1.Capacity);//8

            Console.WriteLine("*****for循环遍历*****");
            //for循环遍历
            for (int i = 0; i < list1.Count; i++)
            {
                Console.WriteLine(list1[i]);
                //99
                //2
                //3
                //4
            }

            Console.WriteLine("*****foreach遍历*****");
            //foreach遍历
            foreach (int item in list1)
            {
                Console.WriteLine(item);
                //99
                //2
                //3
                //4
            }

            //当前list1 {99,2,3,4}
            #endregion

            #endregion


        }
    }
}

8.3 练习题

请描述List和ArrayList的区别

  • List内部封装的是一个泛型数组,基本不存在装箱拆箱(除非泛型传入object)。
  • ArrayList内部封装的是一个object数组。

建立一个整形List,为它添加10~1,删除List中第五个元素,遍历剩余元素并打印

主函数内

// 声明list
List<int> list = new List<int>();

// 遍历设置元素10~1
for (int i = 10; i > 0; i--)
{
    list.Add(i);
}

// 删除List中第五个元素
list.RemoveAt(4);

// 遍历剩余元素打印
foreach (int item in list)
{
    Console.WriteLine(item);
}

一个Monster基类,Boss和Gablin类继承它。在怪物类的构造函数中,将其存储到一个怪物List中,遍历列表可以让Boss和Gablin对象产生不同攻击

class语句块外 namespace语句块内

// 怪物类
abstract class Monster
{
    // 怪物List 静态的 不然每个怪物里都有
    public static List<Monster> monsters = new List<Monster>();

    // 构造函数 初始化时就添加自己到怪物List
    public Monster()
    {
        monsters.Add(this);
    }

    // 抽象攻击方法
    public abstract void Atk();
}

// 哥布林类
class Gablin : Monster
{
    public override void Atk()
    {
        Console.WriteLine("哥布林的攻击");
    }
}

// Boss类
class Boss : Monster
{
    public override void Atk()
    {
        Console.WriteLine("Boss的攻击");
    }
}

主函数内

// 造几个怪物出来
Boss b = new Boss();
Gablin g = new Gablin();
Boss b2 = new Boss();
Gablin g2 = new Gablin();

// 遍历怪物列表 逐个攻击
foreach (var monster in Monster.monsters)
{
    monster.Atk();
    // Boss的攻击
    // 哥布林的攻击
    // Boss的攻击
    // 哥布林的攻击
}

8.4 练习题代码

using System;
using System.Collections.Generic;

namespace Lesson07_练习题
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("List练习题");

            #region 练习题一
            //请描述List和ArrayList的区别

            //List内部封装的是一个泛型数组 基本不存在装箱拆箱(除非泛型传入object)
            //ArrayList内部封装的是一个object数组
            #endregion

            //主函数内

            #region 练习题二
            //建立一个整形List,为它添加10~1
            //删除List中第五个元素
            //遍历剩余元素并打印

            //声明list
            List<int> list = new List<int>();

            //遍历设置元素10~1
            for (int i = 10; i > 0; i--)
            {
                list.Add(i);
            }

            //删除List中第五个元素
            list.RemoveAt(4);

            //遍历剩余元素打印
            foreach (int item in list)
            {
                Console.WriteLine(item);
            }

            #endregion

            #region 练习题三
            //一个Monster基类,Boss和Gablin类继承它。
            //在怪物类的构造函数中,将其存储到一个怪物List中
            //遍历列表可以让Boss和Gablin对象产生不同攻击

            //造几个怪物出来
            Boss b = new Boss();
            Gablin g = new Gablin();
            Boss b2 = new Boss();
            Gablin g2 = new Gablin();

            //遍历怪物列表 逐个攻击
            for (int i = 0; i < Monster.monsters.Count; i++)
            {
                Monster.monsters[i].Atk();
                //Boss的攻击
                //哥布林的攻击
                //Boss的攻击
                //哥布林的攻击
            }
            #endregion
        }
    }

    //class语句块外 namespace语句块内

    #region 练习题三

    //怪物类
    abstract class Monster
    {
        //怪物List 静态的 不然每个怪物里都有
        public static List<Monster> monsters = new List<Monster>();

        //构造函数 初始化时就添加自己到怪物List
        public Monster()
        {
            monsters.Add(this);
        }

        //抽象攻击方法
        public abstract void Atk();
    }

    //哥布林类
    class Gablin : Monster
    {
        public override void Atk()
        {
            Console.WriteLine("哥布林的攻击");
        }
    }

    //Boss类
    class Boss : Monster
    {
        public override void Atk()
        {
            Console.WriteLine("Boss的攻击");
        }
    }

    #endregion
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏