C#中關於foreach遍曆使用的深入理解

來源:互聯網
上載者:User
在c#中通過foreach遍曆一個列表是經常拿用的方法,使用起來也方便,下面這篇文章先給大家介紹了關於C#中foreach遍曆的使用方法,後面介紹了c#使用foreach注意的一些是,文中通過範例程式碼介紹的非常詳細,對大傢具有一定的參考學習價值,需要的朋友們下面來一起看看吧。

前言

本文主要給大家介紹了關於C#中foreach遍曆的用法以及c#使用foreach需要知道的一些事,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹:

一、C#中foreach遍曆用法

foreach迴圈用於列舉出集合中所有的元素,foreach語句中的運算式由關鍵字in隔開的兩個項組成。in右邊的項是集合名,in左邊的項是變數名,用來存放該集合中的每個元素。

該迴圈的運行過程如下:每一次迴圈時,從集合中取出一個新的元素值。放到唯讀變數中去,如果括弧中的整個運算式傳回值為true,foreach塊中的語句就能夠執行。一旦集合中的元素都已經被訪問到,整個運算式的值為false,控制流程程就轉入到foreach塊後面
的執行語句。

foreach語句經常與數組一起使用,下面執行個體將通過foreach語句讀取數組的值並進行顯示。

數組的屬性:Array.Length數組的容量

利用這個屬性,我們可以取得數組對象允許儲存的容量值,也就是數組的長度、元素個數,這個比較好理解,數組還有其他的屬性,比如數組的維數等,屬性的用法比較簡單,學會一種,其他的格式基本一致,這裡我們就不舉例了。

當數組的維數、容量較多時,C#提供了foreach語句,專門用來讀取集合/數組中的所有元素,我們把這種功能叫做遍曆。文法書寫如下:

遍曆數組:foreach(type objName in collection/Array)

這段語句會逐一檢查數組中的所儲存的變數值,並且一一將其取出,其中的type是你所要讀取的數組對象將要儲存在objName變數的資料類型,而objName是定義了一個type類型的變數名,代表每一次從集合和數組(collection/Array)中取得的元素,collection/Array則是所要存取的數組對象。用這種方法只需寫一個foreach就可以遍曆出除交錯數組以外的所有維數的數組。

註: objName的資料類型type必須與collection/Array對象的類型相同或比它大。

下面我們舉一個用foreach和for遍曆規則數組的例子,其中涉及到了一個數組得到維數的方法,比較foreach在一次性遍曆規則數組上的優勢。


int[,,] a = new int[2, 2, 2] { {{ 1, 2 }, { 3,4}},{{ 5, 6 }, { 7,8}} };// 定義一個2行2列2縱深的3維數組afor (int i = 0; i < a.GetLength (0) ;i++ ) //用Array.GetLength(n)得到數組[0,1,,,n]上的維數的元素數,0代表行,1列,n代表此數組是n+1維{ for (int j = 0; j < a.GetLength(1); j++) { for (int z = 0; z < a.GetLength(2);z++ )//2代表得到縱深上的元素數,如果數組有n維就得寫n個for迴圈 { Console.WriteLine(a[i,j,z]); } }}

用foreach迴圈一次性遍曆a數組


int[,,] a = new int[2, 2, 2] { {{ 1, 2 }, { 3,4}},{{ 5, 6 }, { 7,8}} };//定義一個2行2列2縱深的3維數組aforeach(int i in a){ Console .WriteLine (i);}

這兩種代碼執行的結果是一樣的都是 每行一個元素,共8行,元素分別是1 2 3 4 5 6 7 8

下面我們再做個例子,是一個利用for和foreach迴圈做的存取數組元素的例子,首先提示使用者輸入學生的個數,然後把學生個數作為儲存學生姓名的數組names的元素個數,採用for迴圈按照數組的索引i從0位開始迴圈輸出"輸入學生姓名"的提示,並把使用者輸入的學生姓名按照其在數組的索引方式names[i]儲存在names數組中,for迴圈次數的最大值(即索引的最大值)通過數組屬性.Length得到,我們說過容量與索引之間的關係是index=Array.Length-1,本題即i的最大值

必須注意的是:藉助foreach,只能一一取得數組中的元素,並不能利用這種語句改變數組所儲存的元素。



using System;class Program{ static void Main() { int count; Console.WriteLine("輸入要登記的學生數"); count = int.Parse(Console.ReadLine()); string[]names = new string[count]; for (int i = 0; i < names.Length; i++) { Console.WriteLine("請輸入第{0}個學生的姓名", i + 1); names[i] = Console.ReadLine(); } Console.WriteLine("已登記的學生如下"); foreach (string name in names) { Console.WriteLine("{0}", name); } Console.ReadKey(); }}

二、c#使用foreach需要知道的

在c#中通過foreach遍曆一個列表是經常拿用的方法,使用起來也方便,效能上也和for沒有多大的差別;那為什麼還要注意呢?我們先下來看下以下這句話:分配的記憶體數量和完成測試所需的時間之間有直接關係。當我們單獨查看的時候,記憶體配置並不是非常昂貴。但是,當記憶體系統只是偶爾清理不使用的記憶體時,問題就出現了,並且問題出現的頻率和要分配的記憶體數量成正比。因此,你分配越多的記憶體,對記憶體進行記憶體回收的頻率就越頻繁,你的代碼效能就會變得越差。

從上面那些話可以看到記憶體的回收是非常損耗資源,那我們再看下一些.net內部類型的實現。

Array:


// System.Arraypublic 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<T>:


// System.Collections.Generic.List<T>public List<T>.Enumerator GetEnumerator(){return new List<T>.Enumerator(this);}

Dictionary<TKey, TValue>:


// System.Collections.Generic.Dictionary<TKey, TValue>public Dictionary<TKey, TValue>.Enumerator GetEnumerator(){return new Dictionary<TKey, TValue>.Enumerator(this, 2);}

從以上代碼來看,我們再進行foreach操作以上對象的時候都會構建一個Enumerator;也許有人會認為這點東西不需要計較,不過的確很多情況是不用關心;但如果通過記憶體分析到到的結果表明構建Enumerator的數量排在前幾位,那就真的要關心一下了。很簡單的一個應用假設你的應用要處理幾W的並發,而每次都存在幾次foreach那你就能計算出有多少對象的產生和回收?

看下一個簡單的分析圖,這裡緊緊是存在一個List'1如果組件內部每個並發多幾個foreach又會怎樣?

改成for的結果又怎樣呢


總結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.