C# 结构、集合、字典
结构
1. 结构是什么?
数据类型,值类型数据(存储值)
值类型:存储的是值,栈内存。
简单值类型(13种)
枚举类型
引用类型:存储的地址,堆栈中
数组
类类型
int[] num = new int[4]
1.等号左侧 : int[] num
栈内存开辟区域,存储变量num
2.等号右侧: new int[4]
堆内存开辟区,存储数组,4个元素
3.将等号左侧与等号右侧连接,
栈内存中开辟的num指向堆内存真正的数组
栈num存储的是什么?num数组的地址
num[0] :
b[1] :
int[] b = new int[3];
Console.WriteLine( b );
Role r = new Role();
2. 结构的基本语法?
struct 结构名
{
//成员
}
注:结构的命名方式和类是一样的。
3. 结构中可以放什么内容?
类中可以放的内容,结构中大部分都可以。
1) 字段
2) 普通方法
3) 含有参数的构造方法
4) 不能放无参数的构造方法
4. 结构的特点(结构和类的区别)
1) 结构是一种值类型 的数据,
创建一个结构对象时,不必使用 new 创建结构对象
一般不会这样用,但是使用:
Point p = new Pint()也不会报错;
例如:
以下几行代码分别将Point作为类和结构
来描述。
class Point { } Point p = new Point();
---------------------------------------------
struct Point { } //创建一个结构
如何创建结构对象,设置字段值
i. Point p ; //直接声明Point类型的变量p
p.x = 20 ; //为p中的x字段赋值
ii. Point p = new Point( 20 );
利用含有一个参数的构造方法为p赋值
2) 结构属于值类型
类属于引用类型
Point p = new Point( 20 ); 类
Point p ;
p.x = 20 ; 结构
3) 何时使用使用类 ?使用结构:?
使用类:
使用结构:
如果描述的对象是一种比较复杂,或字段较多时
就要使用类。
如果要描述一种包含多个值,但是是一种轻量级的
数据类型时,使用结构。
--------------------------------------------------------
集合
程序中存储数据,可以通过哪些方式存储?
1) 存储一个数字,通过哪种方式存储?
如:18
2)存储多个同一类型的多个数据,通过哪种类型存储?
比如:一组数字:10,20,30,40,60
一组名字:"Tom","Lucy","Jack"
集合
1. ArrayList
2. List
3. Dictionary
1.ArrayList
//已经过时了 ArrayList();
using System.Collections;
-------------------------------------------------------
2. List<T>
1) 创建List集合的基本语法:
List<集合>
1. <T> 泛型
T: 数据类型
int,byte ,short ,string
bool
char
Car
Person
Role
Hero
Solider
.....
2. 泛型:
1)类型限制,集合中的数据类型进行限制
2)<T> 表示泛型的写法。
T指的是一种数据类型
3)泛型是一种编译期的类型
(运行之间会进行语法检查)
针对泛型的语法检查:检查的是类型是否匹配
3.List 集合和 ArrayList 集合一样,提供了常用的方法:
1)Count
2) Add()
3) Remove()
4) RemoveAt()
5) Reverse()
6) Contains()
7) ToArray()
.........
练习:
1.创建一个ArrayList集合,集合名为 numbers
2)向集合中添加3个float类型的数据,分别为:
1.1f , 2.2f, 3.3f
3)获取集合的元素个数并打印
4) 对集合进行遍历(使用for或foreach即可)
5) 继续向集合中添加一个bool类型的数据,值为 true
6) 再对集合进行遍历(使用for或foreach即可)
查看是否有错误。
2.创建一个List集合,集合中存储“Book”类型的数据,
集合名为 books.注:请自己创建Book类,包含书名,价格...
1) 创建三个Book类型的对象,并通过Add()方法添加到集合
2)获取集合的长度(Count)
3)遍历books集合中的元素,打印出每一本书的书名
4) 移动集合中下标为1的元素,移除后,打印集合长度
观察是否有变化.提示:RemoveAt(下标值)
5)将books集合转成数组类型 ToArray(),亲打印数组长度
6)将books数组清空,Clear(),然后再打印集合长度。
7)体会List集合是如何限制集合中存放的数据数据类型的.
-----------------------------------------------------
3.Dictionary 字典
List<T>
Dictionary <key,value>
花名册
1-王勇辉
2-李...
3-宋旗舰
1. Dictionary 基本语法:
Dictionary<TKEY,TVALUE> dic = new
Dictionary < TKey , TValue > ();
键 值对
Dictionary<int ,string> names = new .....
names.Add( 1 ,"王勇辉" );
names.Add( 2, "Lucy" );
names.Add( 3, "宋旗舰" );
2. Dictionary 如何存储数据
使用 键值对 的形式存储。
存放字典中的每个元素,有两分组成:key,value
字典中的key的值不能重复,否则 报错;
但是value的值却可以重复。
集合中的所有key值,可以通过方法获取到,是一个集合
集合中的所有value值,可以通过方法获取到,是一集合
1101010101203 , "老王"
1101010138434 , "老王"
3. 常用方法:
1) 如何创建Dictionary集合
2)获取集合中的所有key键,如何遍历所有的键值
3)获取集合中的所有value值,如何遍历所有的键值
4)获取集合中元素的个数(长度)
5)查找集合中是否存在指定的key值
6)查找集合中是否存在指定的value值
7)......
练习:创建一个Dictionary 集合,花名册
学生的编号作为键值,学生的名字作为字典的值。
要求:
1) 有一个集合 : new
2) 向集合中添加数据 :Add()
3) 获取所有学生的编号, 遍历学生的编号 Keys
4) 获取所有学生的名字,遍历学生的姓名 values
5) 查找编写为"18"的这个号码有没有出现在花名册了
想18号所对应的那个学生的学生名字。
ContainsKey()
class Dictionary<TKey, TValue>
{
//KeyCollection作为了字典集合的一个内部类
//直接把它当成一个普通的变量就行
class KeyCollection { }
}
//返回类型是 :KeyCollection 类型的
//但是KeyCollection类型不能直接写,
//应该把它的 上一层上清楚,中间用点
Dictionary<TKey, TValue> . KeyCollection = names.Keys ;
4. 案例
集合总结:
1.ArrayList 集合已经过时,不再使用。
如果在代码中使用,需要手动导入命名究竟:
using System.Collections;
2.List<T> 替代了ArrayList的操作
List<T> 所在的命名空间:System.Collections.Generic
提示了增删改查的常用方法
允许出现相同值的元素
存储数据时,第一个集合元素下标为0,后面为1...
3. Dictionary<Tkey,TValue> 字典集合
以键值对的形式存储数据。
所在的命名空间:System.Collections.Generic
Key,Value ----
------------------------------------------------------
树
二叉树
队列
堆栈
总结:
结构 -- 结构是什么?
和类相似
struct 结构
不能无参数构造方法
继承
内存 -- 数据类型
值类型:分哪几种
13种
结构
枚举
引用类型
new 关键字---属于引用类型
new int[4]
new Hero("name")
interface 接口
委托
string
引用类型在进行参数传递时,传递的是地址
值类型在进行参数传递时,传递的是值
public static void Change( int[] n )
{
n[0] = 100l;
}
static void Main(string[] args)
{ int[] a = { 100,200,300 };
Change( a );
Console.WriteLine( a[0] );
}
day13 (2019.4.18) (2018.01.15.)作业
1.List集合的使用
创建一个List集合,集合名为numbers,集合中用于存储10个数字,
10个数字要求利用随机数产生。范围为(-100,100)
要求:
1) 打印集合中的元素个数
然后使用 for循环遍历集合
2) 向集合最后一个下标处插入int数字的最大值
然后使用 foreach 遍历集合
3) 请尝试移除集合中int类型最大的那个数字,
然后返回结果
4) 移除集合中的所有元素
2. Dictionary<Key,Value> 集合集合
创建一个集合,该集合用于表现游戏角色的基本信息
key表示角色的编号(int),value表示角色
注:集合的key为int类型,集合的value值为Role类型
创建Role类,包含的内容:角色名称,角色年龄
要求:
1) 向集合中添加5个不同的角色,
101 ---- 吕布,18,
102 ---- 西施,20
103 ---- 八戒,30
104 ---- 李白,40
105 ---- 貂蝉,19
2) 请尝试获取集合中的所有 key ,并遍历
3) 请尝试获取集合中的所有 value,并遍历
4) 遍历集合
3. 在已经有继承关系 的试题类中,继续完成以下操作:
1) 构建一个试题类型的数组,Question[]
用于存储5道不同类型的数据
2) 要求,创建单选试题,多选试题,使用父类变量指向子类
对象的方式创建
3) 将试题添加到数组中
4) 从数组中随机取出一道试题,将这道试题打印到控制台
然后提示用户输入答案,判断答案
4. 游戏树 案例,没有完成的同学,
周末请辛苦完成。
作业1:(选做题)
定义一个图形类,Shape.cs -- 父类
包含的内容:
---字段: 图形名字(string name )
---方法: 构造方法(无参数,含有1个参数)
注:方法会被子类重写 ,virutal
求周长 --- double GetLength() --- 0.0
求面积 --- double GetArea() --- 0.0
定义两个子类,一个表示圆形,一个表示矩形
圆形类,Circle.cs , 包含的内容:
---字段: 半径 ( float radius )
---方法: 构造方法(无参,含有两个参数)
重写父类的求周长和求面积的方法
求周长:2 * 圆周率 * 半径
求面积:圆周率 * 半径 * 半径
注:圆周率暂时使用:Math.PI 获取
3) 矩形类,Rectangle.cs , 子类,包含的内容:
---字段:长(float height ),宽(float width)
---方法: 构造方法(无参数,含有2个参数)
重写父类的求周长和求面积的方法
求周长:2 *( 长 + 宽 )
求面积:长*宽
要求:类中的字段全部私有化,类中的方法公开化.
为私有化字段添加标准属性
创建一个圆形,通过属性实现为圆的字段赋值
圆的名字为: 小圆圆,半径为10.0
要求,根据给定的内容,计算圆的周长和面积
创建一个矩形类,通过构造方法为矩形的长和宽字段赋值
长为12.0,宽为5.5
然后通过属性为矩形的名字赋值, 矩形1,
要求,根据给定的内容,计算矩形的周长和面积.
测试类