目录
习题:声明一个Monster类,有一个Attack方法,用一个ArrayList去封装Monster的对象,装10个,遍历monster的list让他们释放攻击方法
创建一个武器类,有一个属性叫做id,每个武器对象的id不一样,创建10把武器,把这10把武器通过id,存储在哈希表中,可以通过id在哈希表中找到对应的武器
手动输入一组数列(可任意长度),并对这个数列进行排序,每次提示用户输入:1、添加一个数字;2、排序并显示数列
书写一个怪物(Monster)类,在怪物类的构造中将其添加到一个静态列表,以怪物类做为基类派生Boss和Gablin的对象产生不用的攻击行为(多态),可以写一个方法,让怪物按攻击力进行排序从小到大。
老师们会在下课时打铃(事件) 学生们想在打铃事件发生的时候做自己的事情;小明想在打铃的时候去买东西吃;小张想在打铃时去打水;小红想在打铃时去打羽毛球
有一个int类型的List,升序排序和降序排序,不能使用List的Sort方法,只能自己写一个排序的方法,通过委托传递方法变量去改变排序的逻辑
数据结构
描述数据之间的关系
行为:添加数据、删除数据、插入数据、查找数据
追加数据:向结构的末尾添加一个数据
删除数据:向结构中删除指定的数据
插入数据:向结构中某位置插入指定的数据
查找数据:可以查找并访问到该数据
修改数据:对该结构指定的数据进行重新赋值
线性、链式、树状、图形、散列
链式,是非连续的内存空间,是每个数据分成三部分
头、数据、尾,每个数据的尾部连接下一个数据的头部
所以在内存不是连续的空间,而是一个一个的空间,通过头尾地址连接在一起
集合
Collection是C#写好的数据结构类库
ArrayList、HashTable、Stack、Queue
如果你是用这些数据结构类的模板,要先引用System.Collections;
就可以通过类名去实例化它的对象
动态数组ArrayList
习题:声明一个Monster类,有一个Attack方法,用一个ArrayList去封装Monster的对象,装10个,遍历monster的list让他们释放攻击方法
internal class Monster
{
public string name;
public Monster(string name)
{
this.name = name;
}
public void Attack()
{
Console.WriteLine("{0}攻击了", name);
}
}
static void Main(string[] args)
{
ArrayList monsterList=new ArrayList();
for(int i=0;i<10;i++)
{
monsterList.Add(new Monster("第"+i+"号哥布林"));
}
for (int i = 0; i < monsterList.Count; i++)
{
if(monsterList[i] is Monster)
{
(monsterList[i] as Monster).Attack();
//ArrayList装载的是Object类型,需要里氏转换原则
}
}
}
哈希表HashTable
创建一个武器类,有一个属性叫做id,每个武器对象的id不一样,创建10把武器,把这10把武器通过id,存储在哈希表中,可以通过id在哈希表中找到对应的武器
static void Main(string[] args)
{
Hashtable table=new Hashtable();
//假设有一把武器,叫霜之哀伤,id为123
//并把霜之哀伤放进我的武器目录里
Weapon a = new Weapon("霜之哀伤");
table.Add("123",a);
table.Add("456",a);
Console.WriteLine(table["456"]);
}
internal class Weapon
{
public string name;
public Weapon(string name)
{
this.name = name;
}
public override string ToString()
{
return name;
}
}
栈Stack
栈在游戏开发中的应用
队列Queue
游戏开发中的应用
泛型
因为在编程中想先不定义数据类型,只想先写逻辑,可以使用Object类型,这样逻辑就适用于所有类型,但是,在运行中,Object类型的变量会需要转换到对应类型,浪费资源,所以出现泛型,代替Object类型的方案
使用泛型,可以延迟定义数据类型,来编写程序
泛型是一种将逻辑应用到不同数据类型上的机制,可以通过类型代替符来暂时代参数的数据类型,这样只需要在编译的时候,编译器会自动将替代符编译成对应数据类型来处理
手动输入一组数列(可任意长度),并对这个数列进行排序,每次提示用户输入:1、添加一个数字;2、排序并显示数列
static void Main(string[] args)
{
List<int> list = new List<int>();
list.Add(1);
list.Add(4);
list.Add(8);
list.Add(2);
list.Add(3);
list.Add(9);
list.Add(5);
list.Add(6);
list.Add(7);
list.Add(10);
Console.WriteLine("提示:用户输入1,可添加一个数字;如果用户输入2,排序并显示此数列");
int a=int.Parse(Console.ReadLine());
if(a==1)
{
list.Add(a);
}
if(a==2)
{
list.Sort();
for(int i=0;i<list.Count;i++)
{
Console.WriteLine(list[i]);
}
}
}
书写一个怪物(Monster)类,在怪物类的构造中将其添加到一个静态列表,以怪物类做为基类派生Boss和Gablin的对象产生不用的攻击行为(多态),可以写一个方法,让怪物按攻击力进行排序从小到大。
字典
书写一个方法,可以把输入的数字转换成中文数字
把123转换为:壹贰参. Dictionary<char,char>
思路:建立一个0-9的字典,作为key存储,对应value壹贰参,输入参数作为键在字典里查找,再把值保存下来
委托
老师们会在下课时打铃(事件) 学生们想在打铃事件发生的时候做自己的事情;小明想在打铃的时候去买东西吃;小张想在打铃时去打水;小红想在打铃时去打羽毛球
事件
委托变量如果公开出去,很不安全,外部可以随意调用
所以取消public,封装它,可以自己书写两个方法,供外部注册与注销,委托调用在子方法里调用,这样封装委托变量可以使它更安全,这个叫做事件。
C#为了方便封装委托变量,推出一个特性event事件,在委托变量前用event修饰这个变量,这个委托变量就变成了事件,这样的话,这个委托变量就算公开出去也没有关系,因为外部只能对这个变量进行注册和注销,只能内部进行触发。
观察者模式
匿名委托与Lambda表达式
有一个int类型的List,升序排序和降序排序,不能使用List的Sort方法,只能自己写一个排序的方法,通过委托传递方法变量去改变排序的逻辑
匿名方法
和委托搭配使用,方便我们快速对委托进行传参【作用】
不需要我们去定义一个新的函数
直接用delegate关键字代替方法名,后面跟上参数列表与方法体
Delegate(参数列表){方法体}
Lambda表达式 匿名方法的升级
更加简写
(参数列表)=>{方法体}
当你的方法体只有一条语句的时候,可以不写return,甚至可以没有花括号
参数列表的参数甚至可以不写数据类型
如果说方法体里一旦出现了return,一定要加上花括号
泛型委托
自定义泛型委托
delegate T 委托名<T>(T 参数);
C# 提供好了两个泛型委托的模板供我们使用
这两个模板基本上就可以适用于所有的委托
所以其实是不需要我们自定义的
- 不带返回类型的泛型委托——Action<类型1,类型2,……,类型n>参数列表对应的参数类型
- 带返回类型的泛型委托——Func<类型1,类型2,……,类型n>参数列表的末尾类型是作为返回类型使用