C#集合與泛型

一、什么是集合

引自數(shù)學(xué)的一種概念,表示一組具有共同性質(zhì)的數(shù)學(xué)元素的組合,例如:實(shí)數(shù)集合、有理數(shù)集合

雖然集合引用自數(shù)學(xué),但也可以擴(kuò)展成表示一組具有共同性質(zhì)的元素的集合,這里的元素可以是人、物等,在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,集合表示一組具有相同性質(zhì)的對(duì)象,是對(duì)各種集合類進(jìn)行實(shí)例化的結(jié)果。

集合中包含的對(duì)象稱為集合元素。集合分為泛型集合類和非泛型集合類。

(泛型集合可以理解為指定了數(shù)據(jù)類型的動(dòng)態(tài)集合)

二、數(shù)組

數(shù)據(jù)也是一種集合,要表示一組數(shù)據(jù)的集合,最常用的辦法就是用數(shù)組。

1.數(shù)組:一組具有相同類型的數(shù)據(jù)(變量或?qū)ο螅┑募?,如一組證書(shū)、一組字符等

2.數(shù)組的定義:

-元素類型:給定類型的數(shù)組只能保存相同類型的元素

-數(shù)組維數(shù)和長(zhǎng)度

3.數(shù)組的遍歷:

-foreach語(yǔ)句進(jìn)行遍歷

static void traversing()

{

int[] MyArray={12,25,27,89};

foreach(int number in MyArray)

{

Console.WriteLine(number);

}

Console.ReadLine();

}

4.數(shù)組的排序

-升序:Array.Sort(數(shù)組名)

-反轉(zhuǎn):Array.Reverse(數(shù)組名)

5.數(shù)組的問(wèn)題

-數(shù)組的大小是固定的,在聲明數(shù)組時(shí)必須指定數(shù)組的長(zhǎng)度,數(shù)組的長(zhǎng)度過(guò)長(zhǎng)會(huì)造成內(nèi)存的浪費(fèi)。數(shù)組長(zhǎng)度過(guò)短又可能有溢出的風(fēng)險(xiǎn)

-數(shù)據(jù)類型的單一性,數(shù)組只能表示一組相同類型的元素,無(wú)法表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)

解決辦法:C#提供了ArrayList對(duì)象來(lái)克服這些缺點(diǎn)

三、數(shù)組列表ArrayList

1.ArrayList的特點(diǎn):其大小是按照其中存儲(chǔ)的數(shù)據(jù)來(lái)動(dòng)態(tài)擴(kuò)充與收縮的,在聲明時(shí)不需要指定它的長(zhǎng)度,即一個(gè)動(dòng)態(tài)數(shù)組

2.聲明方式

方式一:ArrayList aList=new ArrayList();

public static void aList1()

{

ArrayList alist = new ArrayList(); //聲明一個(gè)ArrayList對(duì)象

for(int i = 0; i < 10; i++) //給其添加10個(gè)int類型的元素值

{

alist.Add(i);

Console.WriteLine(alist[i]);

}

Console.ReadKey();

}

方式二:ArrayList alist=new ArrayList(arrayName);

先定義一個(gè)普通數(shù)組,再將數(shù)組中的元素賦值給數(shù)據(jù)列表ArrayList

public static void aList2()

{

? int[] arr=new int[]{11,22,33,44,55,66,77,88};

? ArrayList alist=newArrayList(arr);

? for(int i=0;i<aList.Count;i++)

? {

?? Console.WriteLine(aList[i]);

? }

}

3.添加、移除元素

aList.Add(i);//在集合末尾添加元素i

aList.Insert(2,i);//在指定位置添加元素i

aList.Remove(i);//移除第一個(gè)匹配的元素i

aList.RemoveAt(3);//移除指定位置的元素

aList.Clear();//移除所有元素

aList.RemoveRange(3,5);//移除一定范圍內(nèi)的元素

4.ArrayList的問(wèn)題

-拆箱和裝箱:ArrayList非常方便,它不像數(shù)組只能存儲(chǔ)一種指定的數(shù)據(jù)類型,ArrayList可以存儲(chǔ)任何引用類型和值類型,但是這種便利的代價(jià)是需要把任何一個(gè)加入ArrayList的引用類型或值類型都隱式地轉(zhuǎn)化成Object類型(所有類的超類),因此在存儲(chǔ)或檢索這些值類型的時(shí)候通常發(fā)生裝箱和拆箱操作。

裝箱:將值類型的數(shù)據(jù)打包到引用類型的實(shí)例中

比如將string類型的值abc賦給object對(duì)象objString s=”abc”;object obj=(object)s;

拆箱:從引用類型數(shù)據(jù)中提取值類型

比如將object對(duì)象obj的值賦給string類型的變量sobject obj=”abc”;string s=(string)obj;

裝箱和拆箱的操作降低了系統(tǒng)的性能

-類型安全:缺乏編譯時(shí)的類型檢查,ArrayList把任何類型都轉(zhuǎn)換成Object,但把String和int變量放在一個(gè)ArrayList中在進(jìn)行數(shù)據(jù)處理時(shí)會(huì)發(fā)生錯(cuò)誤

解決辦法:代碼在實(shí)例化之前指定所需的特定數(shù)據(jù)類型,這樣編譯器就可以同時(shí)進(jìn)行類型檢查,而且不需要將類型轉(zhuǎn)換成Object,即ArrayList需要一個(gè)類型參數(shù),于是就有了泛型集合

四、泛型集合List

1.聲明

泛型集合用List<T>表示,它是ArrayList類的泛型等效類,區(qū)別在于,在聲明List集合時(shí),同時(shí)需要為其聲明List集合內(nèi)數(shù)據(jù)的類型。

定義方式一:

List<T> alist=new List<T>();

定義方式二:

List<T> aList=new List<T>(arrayName);

public static void List1()

{

? String [] arr=new String[]{"Heaven","Chris"};

? List<string> alist=new List<string>(arr);

? foreach(string s in alist)

{

? Console.WriteLine(s);

}

}

2.List的屬性與方法

Count屬性,用于獲取數(shù)組中當(dāng)前元素?cái)?shù)量Item() 通過(guò)指定索引獲取或設(shè)置元素。對(duì)于List類來(lái)說(shuō),它是一個(gè)索引器。Add() 在List尾部添加一個(gè)元素的方法AddRange() 在List尾部添加一組元素Clear() 在List內(nèi)移除所有元素Any()測(cè)試一個(gè)元素是否在List內(nèi)Contains() 測(cè)試一個(gè)元素是否在List內(nèi)CopyTo() 把一個(gè)List拷貝到一維數(shù)組內(nèi)Exists() 測(cè)試一個(gè)元素是否在List內(nèi)Find() 查找并返回List內(nèi)的出現(xiàn)的第一個(gè)匹配元素FindAll() 查找并返回List內(nèi)的所有匹配元素Getrange() 拷貝指定范圍的元素到新的List內(nèi)

IndexOf()重載的公有方法,查找并返回每一個(gè)匹配元素的索引Insert()在List內(nèi)插入一個(gè)元素InsertRange()在List內(nèi)插入一組元素LastIndexOf()重載的公有方法,,查找并返回最后一個(gè)匹配元素的索引Remove()移除與指定元素匹配的第一個(gè)元素RemoveAt()移除指定索引的元素RemoveRange()移除指定范圍的元素Reverse()反轉(zhuǎn)List內(nèi)元素的順序Sort()對(duì)List內(nèi)的元素進(jìn)行排序ToArray()把List內(nèi)的元素拷貝到一個(gè)新的數(shù)組內(nèi)trimToSize()將容量設(shè)置為L(zhǎng)ist中元素的實(shí)際數(shù)目

五、LINQ查詢簡(jiǎn)介

1.簡(jiǎn)介:LINQ是在C#中引入的類似于SQL的查詢模式,支持幾乎任何類型的數(shù)據(jù)源,是一組基于C#語(yǔ)言的擴(kuò)展語(yǔ)句,使用C#程序代碼以查詢數(shù)據(jù)庫(kù)相同的方式操作內(nèi)存數(shù)據(jù)

2.簡(jiǎn)單的例子

有如下兩個(gè)字符串和整數(shù)元素組成的數(shù)組,請(qǐng)編寫(xiě)一段代碼實(shí)現(xiàn)如下功能:

-找出所有姓張的人

-找出大于50的值,并進(jìn)行排序。

string[] names={"張三","李四","王五","張國(guó)榮"};

int[] score={19,53,56,49,88,53,95};

publicstaticvoidlinqexp1()

{

string[]names={"張三","李四","王五","張國(guó)榮"};

//linq查詢語(yǔ)句

varresults=fromainnames

wherea.StartWith("張")

selecta

Console.WriteLine("姓張的有:");

ShowList(results.ToArray());

}

publicstaticvoidlinqexp2()

{

int[]score={19,53,56,49,88,53,95};

varresults=frombinscore

whereb>=50

orderbyb

selectb;

ShowList(results.ToArray());

}

常用表達(dá)式:from子句指定數(shù)據(jù)源,where子句指定篩選條件,select子句指定返回的元素。

完整關(guān)鍵字:

-基本子句:from、where、select、group、orderby、join

-定義變量子句:into、let

-輔助關(guān)鍵字:in、on、equals、by、ascending、descending

六、Lambda表達(dá)式(點(diǎn)標(biāo)記方法)

1.什么是Lambda

我們知道,對(duì)于一個(gè)Java變量,我們可以賦給其一個(gè)“值”。

如果你想把“一塊代碼”賦給一個(gè)Java變量,應(yīng)該怎么做呢?

比如,我想把右邊那塊代碼,賦給一個(gè)叫做aBlockOfCode的Java變量:

在Java 8之前,這個(gè)是做不到的。但是Java 8問(wèn)世之后,利用Lambda特性,就可以做到了。

當(dāng)然,這個(gè)并不是一個(gè)很簡(jiǎn)潔的寫(xiě)法。所以,為了使這個(gè)賦值操作更加elegant, 我們可以移除一些沒(méi)用的聲明

圖源網(wǎng)絡(luò)(侵刪)

這樣,我們就成功的非常優(yōu)雅的把“一塊代碼”賦給了一個(gè)變量。而“這塊代碼”,或者說(shuō)“這個(gè)被賦給一個(gè)變量的函數(shù)”,就是一個(gè)Lambda表達(dá)式(至于Lambda表達(dá)式的語(yǔ)法規(guī)則,請(qǐng)聽(tīng)下回分解啦

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

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

  • 四、集合框架 1:String類:字符串(重點(diǎn)) (1)多個(gè)字符組成的一個(gè)序列,叫字符串。生活中很多數(shù)據(jù)的描述都采...
    佘大將軍閱讀 874評(píng)論 0 2
  • 一、基礎(chǔ)知識(shí):1、JVM、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,563評(píng)論 0 4
  • 概要 上一章,我們學(xué)習(xí)了Collection的架構(gòu)。這一章開(kāi)始,我們對(duì)Collection的具體實(shí)現(xiàn)類進(jìn)行講解;首...
    廢棄的root閱讀 996評(píng)論 0 4
  • 春水初生,春林初盛,春風(fēng)十里不如你。 愿有歲月可回首,且以深情共白頭 。 01 她是尊貴無(wú)比的公主,他是驍勇善戰(zhàn)的...
    難得從心閱讀 290評(píng)論 2 2
  • 今天看書(shū)看了很多內(nèi)容,但是腦子里確實(shí)一片空白,俗稱短路了…… 本書(shū)當(dāng)中,作者多次提到他被父母催婚的問(wèn)題。三十有余的...
    易秒閱讀 532評(píng)論 3 1

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