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