9yue6
集合(Collection
一、集合的作用:
有两种方式可以将对象分组:
1、创建对象数组 2、创建对象集合
数组的初始化必须要固定数量,即数组的长度。
集合提供一种灵活的处理方法。与数组不同,处理的对象
组可根据程序更改的需要动态地增长和收缩。 对于某些集
合,您可以为放入该集合的任何对象分配一个“键”,以
便使用该键快速检索对象。
注:集合是类,因此必须声明新集合后,才能向该集合中
添加元素。
1、创建对象数组
集合分为两种类型:非泛型集合和泛型集合。
使用非泛型集合的 需引入:System.Collections命名空间。
使用泛型集合需引入:System.Collections.Generic命名空间
(非泛型相比泛型效率较低因为要进行装箱拆箱操作
Stack
定义:
Stack stack = new Stack();
Stack<int> stackInt = new Stack();
可以重写堆栈
publicclass MyStack:Stack{
override
}
Stack类成员介绍
Push()将对象插入Stack的顶部(入栈)推入元素
Pop()移除并返回Stack顶部的对象(出栈)弹出元素
Peek()返回位于Stack顶部的对象,但不移除
Contains确定某元素是够在Stack中
Clear()从Stack中移除所有对象
Count获取Stack中包含的元素
入栈Push
stack.Push();
出栈Pop
intnumber = (int)stack.Pop();
objectobj = stack.Pop ();
Console.WriteLine();
获取栈顶元素Peek
objectobj_1 = stack.Pop();//区别
Console.WriteLine(obj_1);
objectobj_2 = stack.Peek ();
Console.WriteLine(obj_2);
是否包含某个元素
stack.Contains("1");
转为数组
object[]objs =stack.ToArray();
获取栈的长度
intcount =stack.Count;
for(int i = 0; i < count; i++) {
stack.Pop();
}
队列Queue
Queue成员
同样也实现了ICollection和IEnumerable
Enqueue()将对象添加到Queue的结尾处
Dequeue()移除并返回Queue开始处的对象
其他和Stack没有区别
Queue总结
1.先进先出(FIFO)的一种数据结构。
2.随着向Queue 中添加元素,容量通过重新分配按需自动增加。
可通过调用 TrimToSize 来减少容量。
3.Queue 接受 null 作为有效值并且允许重复的元素。
4.在AI寻路算法中经常用的Queue。
入队列
queue.Enqueue("li");
queue_2.Enqueue(1);
出队列
objectobj =queue.Dequeue();
intnumber =queue_2.Dequeue ();
获取队列头部元素
objectobj_1 =queue.Peek();
intnumber_1 =queue_2.Peek ();
Console.WriteLine(obj_1);
Console.WriteLine(number_1);
队列元素个数
queue_2.Count;
queue.Count;
移除多余空间
queue.TrimToSize();
Console.WriteLine(queue.Count);
查阅MSDN练习堆栈,队列中的ToArrayCopyTo
Dictionary字典
Dictionary(TKey,TValue)类称为字典类
TKey表示键的类型
TValue表示字典中的值类型
Dictionary类实现了ICollection、IEnumerable、IDictionary·接口。
字典定义如下:
Dictionary<string,int >dic = new Dictionary<string,int>();
字典中键必须是唯一的,不是所有类型都可以是键(一般是string int),
所有类型都可以作为值
总结:
字典是一个泛型集合
TKey必须唯一,Value可以是变量,也可以是对象
例子:
Dictionary dic = new Dictionary();
dic.Add("One",1);//一组键值对
dic.Add("Two",2);
intnumber = dic ["One"];
dic["One"] = 31;
intnumber_2 = dic ["One"];
Console.WriteLine(number);
Console.WriteLine(number_2);
Dictionary strDic = new Dictionary();
strDic["Li"]= "an";//自动Add
strDic["Li"]= "sa";
strDic["Li"] = null;//可以存空对象
Console.WriteLine(strDic.Count);
通过键移除对应的值
strDic.Remove("Li");
Console.WriteLine(strDic.Count);
是否包含键/值
if(dic.ContainsKey ("Two")) {
Console.WriteLine("包含Two键");
}
if(dic.ContainsValue(2)) {
Console.WriteLine("包含2值");
}
打印键值对
foreach(string key in dic.Keys){
Console.WriteLine(key + ":"+dic[key]);
}
foreach(int value in dic.Values){
Console.WriteLine("value: "+value);
}
用户输入10个姓名,可以重复输入同一个姓名,输出每个姓名,并输出每个姓名输入的多少次
Dictionary dicName = new Dictionary();
Console.WriteLine("输入十次姓名");
for(int i = 0; i <= 10; i++) {
stringstr = Console.ReadLine ();
if(dicName.ContainsKey (str)) {
dicName[str] += 1;
}else {
dicName[str] = 1;
}
}
foreach(string name in dicName.Keys) {
Console.WriteLine(name+"出现为"+dicName[name]);
}
AarryList
(非泛型相比泛型效率较低因为要进行装箱拆箱操作
ArrayList是一个特殊的数组。通过添加和删除元素,就
可以动态改变数组的长度。
ArrayList并不是强类型,ArrayList 可能并不总是提供特定任务的最佳性能。
ArrayList类实现了IList、ICollection和IEnumerable接
口。
int[]numbers = {1,23,4,5,11,44};
ArrayList arrayList = new ArrayList (numbers );//默认为一个长度为0的数组
Add添加
arrayList.Add("Wo");
arrayList.AddRange(new int []{9,8,7});
Remove移除
arrayList.Remove(23);//元素
arrayList.RemoveAt(2);//位置
arrayList.RemoveRange(1,2);//从下标1开始数两为得到逆序数组
arrayList.Reverse();//(可以写一个范围的逆序)
两个对象作比较
arrayList.Equals();
从下标2开始往后截取两位
ArrayListarr = arrayList.GetRange (2, 2);
查找数组元素下标(在数组中的第一个)
intfirstIndex = arrayList.IndexOf("Wo");
intlastIndex = arrayList.LastIndexOf ("Wo");
插入元素/数组
arrayList.Insert();
arrayList.InsertRange();
更改元素
arrayList.SetRange(2,new string []{"la","do","bili"});
遍历集合
foreach(object obj in arrayList) {
Console.Write(obj+" ");
}
ArrayList总结:
1.支持自动改变大小的功能。
2.可以灵活的插入元素、删除元素、访问元素。
3.不是强类型,速度跟数组比起来要慢。
相对于ArraryList而言,List在大多数情况下执行更好,更安全
如果对类型T只用值类型的话,比较速度得考虑装箱开箱的问题
List(泛型)
List类表示可通过索引访问的对象的强类型列表。 提供用于对列表进行搜索、排序和操作的方法。List是ArrayList类的泛型等效类,该类使用大小可按需动态增加的数组实现IList泛型接口。List类同样也是实现了
ICollection、IEnumerable和IList接口。
例子:
Listnumbers = new List (new int[]{12,3,44,1,15,2});
排序
numbers.Sort();
foreach(int n in numbers ) {
Console.WriteLine(n);
}
自学Hashtable和SortedList。
索引器
(索引器可以重载
总结:
1.数据类型是表示将要存取的数组或集合元素的类型。
2.索引器类型表示该索引器使用哪一类型的索引来存取
数组或集合元素,可以是整数,可以是字符串;
this表示操作本对象的数组或集合成员,可以简单把它理解成索引器的名字,因此索引器不能具有用户定义的名称.
创建一个索引器,对类里面的字典进行数据的存取,用来记录学生的姓名和分数
归纳:
Stack于Queue有什么区别。
Dictionary有什么优点?
ArrayList和List的比较。