C#(21)集合 字典 索引器

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的比较。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • //非泛型数列取出来都为 objec //栈 对列 数组 都可以纯空数据 //Stack 栈 数据结构n 可被继承...
    妈妈说喝牛奶能长个阅读 178评论 0 0
  • ArrayList (非泛型集合 using System.Collections;) public void T...
    Unity开发阅读 339评论 1 0
  • 1. [C#语言基础]请简述拆箱和装箱。 答: 装箱操作: 值类型隐式转换为object类型或由此值类型实现的任何...
    胤醚貔貅阅读 4,667评论 1 29
  • 首先 会联系到相关的数组类型 但是数组有两个不能改变 1.存入的内容必须需要统一变量类型(除非使用object数组...
    TALY阅读 183评论 0 0
  • https://msdn.microsoft.com/zh-cn/library/system.collectio...
    LH_晴阅读 412评论 0 0