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

9yue6

集合(Collection

一、集合的作用:

有兩種方式可以將對象分組:

1、創(chuàng)建對象數(shù)組 ?2、創(chuàng)建對象集合

數(shù)組的初始化必須要固定數(shù)量,即數(shù)組的長度。

集合提供一種靈活的處理方法。與數(shù)組不同,處理的對象

組可根據(jù)程序更改的需要動態(tài)地增長和收縮。 對于某些集

合,您可以為放入該集合的任何對象分配一個“鍵”,以

便使用該鍵快速檢索對象。

集合是類,因此必須聲明新集合后,才能向該集合中

添加元素。

1、創(chuàng)建對象數(shù)組

集合分為兩種類型:非泛型集合和泛型集合。

使用非泛型集合的 需引入:System.Collections命名空間。

使用泛型集合需引入:System.Collections.Generic命名空間

(非泛型相比泛型效率較低因?yàn)橐M(jìn)行裝箱拆箱操作

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();//區(qū)別

Console.WriteLine(obj_1);

objectobj_2 = stack.Peek ();

Console.WriteLine(obj_2);

是否包含某個元素

stack.Contains("1");

轉(zhuǎn)為數(shù)組

object[]objs =stack.ToArray();

獲取棧的長度

intcount =stack.Count;

for(int i = 0; i < count; i++) {

stack.Pop();

}


隊(duì)列Queue


Queue成員

同樣也實(shí)現(xiàn)了ICollection和IEnumerable

Enqueue()將對象添加到Queue的結(jié)尾處

Dequeue()移除并返回Queue開始處的對象

其他和Stack沒有區(qū)別


Queue總結(jié)

1.先進(jìn)先出(FIFO)的一種數(shù)據(jù)結(jié)構(gòu)。

2.隨著向Queue 中添加元素,容量通過重新分配按需自動增加。

可通過調(diào)用 TrimToSize 來減少容量。

3.Queue 接受 null 作為有效值并且允許重復(fù)的元素。

4.在AI尋路算法中經(jīng)常用的Queue。


入隊(duì)列

queue.Enqueue("li");

queue_2.Enqueue(1);

出隊(duì)列

objectobj =queue.Dequeue();

intnumber =queue_2.Dequeue ();

獲取隊(duì)列頭部元素

objectobj_1 =queue.Peek();

intnumber_1 =queue_2.Peek ();

Console.WriteLine(obj_1);

Console.WriteLine(number_1);

隊(duì)列元素個數(shù)

queue_2.Count;

queue.Count;

移除多余空間

queue.TrimToSize();

Console.WriteLine(queue.Count);

查閱MSDN練習(xí)堆棧,隊(duì)列中的ToArrayCopyTo


Dictionary字典


Dictionary(TKey,TValue)類稱為字典類

TKey表示鍵的類型

TValue表示字典中的值類型

Dictionary類實(shí)現(xiàn)了ICollection、IEnumerable、IDictionary·接口。


字典定義如下:

Dictionary<string,int >dic = new Dictionary<string,int>();

字典中鍵必須是唯一的,不是所有類型都可以是鍵(一般是string int),

所有類型都可以作為值



總結(jié):

字典是一個泛型集合

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);

通過鍵移除對應(yīng)的值

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個姓名,可以重復(fù)輸入同一個姓名,輸出每個姓名,并輸出每個姓名輸入的多少次

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+"出現(xiàn)為"+dicName[name]);

}


AarryList

(非泛型相比泛型效率較低因?yàn)橐M(jìn)行裝箱拆箱操作

ArrayList是一個特殊的數(shù)組。通過添加和刪除元素,就

可以動態(tài)改變數(shù)組的長度。

ArrayList并不是強(qiáng)類型,ArrayList 可能并不總是提供特定任務(wù)的最佳性能。

ArrayList類實(shí)現(xiàn)了IList、ICollection和IEnumerable接

口。



int[]numbers = {1,23,4,5,11,44};

ArrayList arrayList = new ArrayList (numbers );//默認(rèn)為一個長度為0的數(shù)組

Add添加

arrayList.Add("Wo");

arrayList.AddRange(new int []{9,8,7});

Remove移除

arrayList.Remove(23);//元素

arrayList.RemoveAt(2);//位置

arrayList.RemoveRange(1,2);//從下標(biāo)1開始數(shù)兩為得到逆序數(shù)組

arrayList.Reverse();//(可以寫一個范圍的逆序)

兩個對象作比較

arrayList.Equals();

從下標(biāo)2開始往后截取兩位

ArrayListarr = arrayList.GetRange (2, 2);

查找數(shù)組元素下標(biāo)(在數(shù)組中的第一個)

intfirstIndex = arrayList.IndexOf("Wo");

intlastIndex = arrayList.LastIndexOf ("Wo");

插入元素/數(shù)組

arrayList.Insert();

arrayList.InsertRange();

更改元素

arrayList.SetRange(2,new string []{"la","do","bili"});

遍歷集合

foreach(object obj in arrayList) {

Console.Write(obj+" ");

}

ArrayList總結(jié):

1.支持自動改變大小的功能。

2.可以靈活的插入元素、刪除元素、訪問元素。

3.不是強(qiáng)類型,速度跟數(shù)組比起來要慢。


相對于ArraryList而言,List在大多數(shù)情況下執(zhí)行更好,更安全

如果對類型T只用值類型的話,比較速度得考慮裝箱開箱的問題


List(泛型)

List類表示可通過索引訪問的對象的強(qiáng)類型列表。 提供用于對列表進(jìn)行搜索、排序和操作的方法。List是ArrayList類的泛型等效類,該類使用大小可按需動態(tài)增加的數(shù)組實(shí)現(xiàn)IList泛型接口。List類同樣也是實(shí)現(xiàn)了

ICollection、IEnumerable和IList接口。



例子:

Listnumbers = new List (new int[]{12,3,44,1,15,2});

排序

numbers.Sort();

foreach(int n in numbers ) {

Console.WriteLine(n);

}

自學(xué)Hashtable和SortedList。


索引器

(索引器可以重載


總結(jié):

1.數(shù)據(jù)類型是表示將要存取的數(shù)組或集合元素的類型。

2.索引器類型表示該索引器使用哪一類型的索引來存取

數(shù)組或集合元素,可以是整數(shù),可以是字符串;

this表示操作本對象的數(shù)組或集合成員,可以簡單把它理解成索引器的名字,因此索引器不能具有用戶定義的名稱.


創(chuàng)建一個索引器,對類里面的字典進(jìn)行數(shù)據(jù)的存取,用來記錄學(xué)生的姓名和分?jǐn)?shù)


歸納:

Stack于Queue有什么區(qū)別。

Dictionary有什么優(yōu)點(diǎn)?

ArrayList和List的比較。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • //非泛型數(shù)列取出來都為 objec //棧 對列 數(shù)組 都可以純空數(shù)據(jù) //Stack 棧 數(shù)據(jù)結(jié)構(gòu)n 可被繼承...
    媽媽說喝牛奶能長個閱讀 234評論 0 0
  • ArrayList (非泛型集合 using System.Collections;) public void T...
    Unity開發(fā)閱讀 388評論 1 0
  • 1. [C#語言基礎(chǔ)]請簡述拆箱和裝箱。 答: 裝箱操作: 值類型隱式轉(zhuǎn)換為object類型或由此值類型實(shí)現(xiàn)的任何...
    胤醚貔貅閱讀 4,978評論 1 28
  • 首先 會聯(lián)系到相關(guān)的數(shù)組類型 但是數(shù)組有兩個不能改變 1.存入的內(nèi)容必須需要統(tǒng)一變量類型(除非使用object數(shù)組...
    TALY閱讀 276評論 0 0
  • https://msdn.microsoft.com/zh-cn/library/system.collectio...
    LH_晴閱讀 520評論 0 0

友情鏈接更多精彩內(nèi)容