這篇文章主要介紹了C#中foreach遍歷使用的示例,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
超過(guò)十多年行業(yè)經(jīng)驗(yàn),技術(shù)領(lǐng)先,服務(wù)至上的經(jīng)營(yíng)模式,全靠網(wǎng)絡(luò)和口碑獲得客戶,為自己降低成本,也就是為客戶降低成本。到目前業(yè)務(wù)范圍包括了:成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè),成都網(wǎng)站推廣,成都網(wǎng)站優(yōu)化,整體網(wǎng)絡(luò)托管,微信小程序開(kāi)發(fā),微信開(kāi)發(fā),成都app軟件開(kāi)發(fā)公司,同時(shí)也可以讓客戶的網(wǎng)站和網(wǎng)絡(luò)營(yíng)銷(xiāo)和我們一樣獲得訂單和生意!一、C#中foreach遍歷用法
foreach循環(huán)用于列舉出集合中所有的元素,foreach語(yǔ)句中的表達(dá)式由關(guān)鍵字in隔開(kāi)的兩個(gè)項(xiàng)組成。in右邊的項(xiàng)是集合名,in左邊的項(xiàng)是變量名,用來(lái)存放該集合中的每個(gè)元素。
該循環(huán)的運(yùn)行過(guò)程如下:每一次循環(huán)時(shí),從集合中取出一個(gè)新的元素值。放到只讀變量中去,如果括號(hào)中的整個(gè)表達(dá)式返回值為true,foreach塊中的語(yǔ)句就能夠執(zhí)行。一旦集合中的元素都已經(jīng)被訪問(wèn)到,整個(gè)表達(dá)式的值為false,控制流程就轉(zhuǎn)入到foreach塊后面?的執(zhí)行語(yǔ)句。
foreach語(yǔ)句經(jīng)常與數(shù)組一起使用,下面實(shí)例將通過(guò)foreach語(yǔ)句讀取數(shù)組的值并進(jìn)行顯示。
數(shù)組的屬性:Array.Length數(shù)組的容量
利用這個(gè)屬性,我們可以取得數(shù)組對(duì)象允許存儲(chǔ)的容量值,也就是數(shù)組的長(zhǎng)度、元素個(gè)數(shù),這個(gè)比較好理解,數(shù)組還有其他的屬性,比如數(shù)組的維數(shù)等,屬性的用法比較簡(jiǎn)單,學(xué)會(huì)一種,其他的格式基本一致,這里我們就不舉例了。
當(dāng)數(shù)組的維數(shù)、容量較多時(shí),C#提供了foreach語(yǔ)句,專(zhuān)門(mén)用來(lái)讀取集合/數(shù)組中的所有元素,我們把這種功能叫做遍歷。語(yǔ)法書(shū)寫(xiě)如下:
遍歷數(shù)組:foreach(type objName in collection/Array)
這段語(yǔ)句會(huì)逐一檢查數(shù)組中的所存儲(chǔ)的變量值,并且一一將其取出,其中的type是你所要讀取的數(shù)組對(duì)象將要存儲(chǔ)在objName變量的數(shù)據(jù)類(lèi)型,而objName是定義了一個(gè)type類(lèi)型的變量名,代表每一次從集合和數(shù)組(collection/Array)中取得的元素,collection/Array則是所要存取的數(shù)組對(duì)象。用這種方法只需寫(xiě)一個(gè)foreach就可以遍歷出除交錯(cuò)數(shù)組以外的所有維數(shù)的數(shù)組。
注: objName的數(shù)據(jù)類(lèi)型type必須與collection/Array對(duì)象的類(lèi)型相同或比它大。
下面我們舉一個(gè)用foreach和for遍歷規(guī)則數(shù)組的例子,其中涉及到了一個(gè)數(shù)組得到維數(shù)的方法,比較foreach在一次性遍歷規(guī)則數(shù)組上的優(yōu)勢(shì)。
int[,,] a = new int[2, 2, 2] { {{ 1, 2 }, { 3,4}},{{ 5, 6 }, { 7,8}} };// 定義一個(gè)2行2列2縱深的3維數(shù)組a for (int i = 0; i < a.GetLength (0) ;i++ ) //用Array.GetLength(n)得到數(shù)組[0,1,,,n]上的維數(shù)的元素?cái)?shù),0代表行,1列,n代表此數(shù)組是n+1維 { for (int j = 0; j < a.GetLength(1); j++) { for (int z = 0; z < a.GetLength(2);z++ )//2代表得到縱深上的元素?cái)?shù),如果數(shù)組有n維就得寫(xiě)n個(gè)for循環(huán) { Console.WriteLine(a[i,j,z]); } } }
用foreach循環(huán)一次性遍歷a數(shù)組
int[,,] a = new int[2, 2, 2] { {{ 1, 2 }, { 3,4}},{{ 5, 6 }, { 7,8}} };//定義一個(gè)2行2列2縱深的3維數(shù)組a foreach(int i in a) { Console .WriteLine (i); }
這兩種代碼執(zhí)行的結(jié)果是一樣的都是 每行一個(gè)元素,共8行,元素分別是1 2 3 4 5 6 7 8
下面我們?cè)僮鰝€(gè)例子,是一個(gè)利用for和foreach循環(huán)做的存取數(shù)組元素的例子,首先提示用戶輸入學(xué)生的個(gè)數(shù),然后把學(xué)生個(gè)數(shù)作為存儲(chǔ)學(xué)生姓名的數(shù)組names的元素個(gè)數(shù),采用for循環(huán)按照數(shù)組的索引i從0位開(kāi)始循環(huán)輸出"輸入學(xué)生姓名"的提示,并把用戶輸入的學(xué)生姓名按照其在數(shù)組的索引方式names[i]
存儲(chǔ)在names數(shù)組中,for循環(huán)次數(shù)的大值(即索引的大值)通過(guò)數(shù)組屬性.Length
得到,我們說(shuō)過(guò)容量與索引之間的關(guān)系是index=Array.Length-1
,本題即i的大值
必須注意的是:借助foreach,只能一一取得數(shù)組中的元素,并不能利用這種語(yǔ)句改變數(shù)組所存儲(chǔ)的元素。
using System; class Program { static void Main() { int count; Console.WriteLine("輸入要登記的學(xué)生數(shù)"); count = int.Parse(Console.ReadLine()); string[]names = new string[count]; for (int i = 0; i < names.Length; i++) { Console.WriteLine("請(qǐng)輸入第{0}個(gè)學(xué)生的姓名", i + 1); names[i] = Console.ReadLine(); } Console.WriteLine("已登記的學(xué)生如下"); foreach (string name in names) { Console.WriteLine("{0}", name); } Console.ReadKey(); } }
二、c#使用foreach需要知道的
在c#中通過(guò)foreach遍歷一個(gè)列表是經(jīng)常拿用的方法,使用起來(lái)也方便,性能上也和for沒(méi)有多大的差別;那為什么還要注意呢?我們先下來(lái)看下以下這句話:分配的內(nèi)存數(shù)量和完成測(cè)試所需的時(shí)間之間有直接關(guān)系。當(dāng)我們單獨(dú)查看的時(shí)候,內(nèi)存分配并不是非常昂貴。但是,當(dāng)內(nèi)存系統(tǒng)只是偶爾清理不使用的內(nèi)存時(shí),問(wèn)題就出現(xiàn)了,并且問(wèn)題出現(xiàn)的頻率和要分配的內(nèi)存數(shù)量成正比。因此,你分配越多的內(nèi)存,對(duì)內(nèi)存進(jìn)行垃圾回收的頻率就越頻繁,你的代碼性能就會(huì)變得越差。
從上面那些話可以看到內(nèi)存的回收是非常損耗資源,那我們?cè)倏聪乱恍?net內(nèi)部類(lèi)型的實(shí)現(xiàn)。
Array:
// System.Array public IEnumerator GetEnumerator() { int lowerBound = this.GetLowerBound(0); if (this.Rank == 1 && lowerBound == 0) { return new Array.SZArrayEnumerator(this); } return new Array.ArrayEnumerator(this, lowerBound, this.Length); }
List
// System.Collections.Generic.Listpublic List .Enumerator GetEnumerator() { return new List .Enumerator(this); }
Dictionary
// System.Collections.Generic.Dictionarypublic Dictionary .Enumerator GetEnumerator() { return new Dictionary .Enumerator(this, 2); }
從以上代碼來(lái)看,我們?cè)龠M(jìn)行foreach操作以上對(duì)象的時(shí)候都會(huì)構(gòu)建一個(gè)Enumerator;也許有人會(huì)認(rèn)為這點(diǎn)東西不需要計(jì)較,不過(guò)的確很多情況是不用關(guān)心;但如果通過(guò)內(nèi)存分析到到的結(jié)果表明構(gòu)建Enumerator的數(shù)量排在前幾位,那就真的要關(guān)心一下了。很簡(jiǎn)單的一個(gè)應(yīng)用假設(shè)你的應(yīng)用要處理幾W的并發(fā),而每次都存在幾次foreach那你就能計(jì)算出有多少對(duì)象的產(chǎn)生和回收?
看下一個(gè)簡(jiǎn)單的分析圖,這里緊緊是存在一個(gè)List'1如果組件內(nèi)部每個(gè)并發(fā)多幾個(gè)foreach又會(huì)怎樣?
改成for的結(jié)果又怎樣呢
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“C#中foreach遍歷使用的示例”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!