深入理解C 中foreach遍歷的使用方法

2022-09-26 04:00:11 字數 2861 閱讀 3318

前言

一、c#中foreach遍歷用法

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

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

foreach語句經常與陣列一起使用,下面例項將通過foreach語句讀取陣列的值並進行顯示。

陣列的屬性:array.length陣列的容量

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

當陣列的維數、容量較多時,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] , },, } };// 定義乙個2行2列2縱深的3維陣列a

for (int i = 0; i < a.getlength (0) ;i++ ) //用array.getlength(n)得到陣列[0,1,,,n]上的維數的元素數,0代表行,1列,n代表此陣列是n+1維

}}用foreach迴圈一次性遍歷a陣列

int[,,] a = new int[2, 2, 2] , },, } };//定義乙個2行2列2縱深的3維陣列a

foreach(int i in a)

這兩種**執行的結果是一樣的都是 每行乙個元素,共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

個學生的姓名", i + 1);

names[i] = console.readline();

} console.writeline("已登記的學生如下");

foreach (string name in names)

", name);

} console.readkey();

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

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

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

array:

// system.array

public ienumerator getenumerator()

return new array.arrayenumerator(this, lowerbound, this.length);

}list:

// system.collections.generic.list

public list.enumerator getenumerator()

dictionary:

// system.collections.generic.dictionary

public dictionary.enumerator getenumerator()

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

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

改成for的結果又怎樣呢

總結本文標題: 深入理解c#中foreach遍歷的使用方法

本文位址: /ruanjian/csharp/199003.html

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

深入理解C語言 深入理解指標

關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...

C 中深入理解dynamic cast

一 指標型別的dynamic cast 如果一條dynamic cast語句的轉換目標是指標型別並且轉換失敗了,會返回乙個空指標,則判斷條件為0,即為false 如果轉換成功,指標為非空,則判斷條件為非零,即true。這樣做可以確保型別轉換和條件檢查在同一條表示式中完成 if derived pd ...