C 高階程式設計(第9版) 第06章 陣列

2022-09-15 06:42:16 字數 3890 閱讀 9639

好久沒發東西了 , 一停下來就會變懶。。。。 雖然沒完成,也就是它吧

--------------------------------- 以下正文 --------------------------------

本章要點

1 簡單陣列

2 多維陣列

3 鋸齒陣列

4 array類

5 作為引數的陣列

6 列舉

7 元組

8 結構比較

同一型別和不同型別的多個物件

如果需要使用同一型別的多個物件,就可以使用集合(參見第10章)和陣列。

c#用特殊的記號宣告、初始化、使用陣列。

array類在後台發揮作用,它為陣列中元素的排序和過濾提供了幾個方法。

使用列舉器,可以迭代陣列中的所有元素。

如果需要使用不同型別的物件,可以使用tuple(元組)型別。

簡單陣列

陣列的宣告

首先定義陣列中元素的型別,其後是一對空方括號和乙個變數名。

陣列的初始化

陣列是引用型別,所以必須給它分配堆上的記憶體。

為此,應使用new運算子,指定陣列中元素的型別和數量來初始化陣列的變數。

[*值型別和引用型別請參見第3章]

宣告和初始化陣列後,變數就引用了n個相應型別的物件,它們位於託管堆上。

在指定了陣列的大小後,如果不複製陣列中的所有元素,就不能重新設定陣列的大小;

如果事先不知道陣列中應包含多少個元素,就可以使用集合。

還可以使用陣列初始化器為陣列的每個元素賦值。

int myarray = new int[4] ;

陣列初始化器只能在宣告陣列變數時使用,不能在宣告陣列之後使用。

訪問陣列元素

使用索引器訪問其中的元素,陣列只支援有整形引數的索引器。

使用引用型別

必須注意:如果陣列中的元素是引用型別,就必須為每個陣列元素分配記憶體。否則會丟擲異常nullreferenceexception。

多維陣列

一般陣列(也稱為一維陣列)用乙個整數來索引;多維陣列用兩個或更多個整數來索引。

在c#中宣告這個二維陣列,需要在方括號中加上乙個逗號,在初始化時應指定每一維的大小(也稱為階)。

int[ , ] twodim = new int[3, 3]; //陣列宣告之後,就不能修改其階數了。

鋸齒陣列

在鋸齒陣列中,每一行都可以有不同的大小。

array類

用方括號宣告陣列是c#中使用array類的表示法。在後台使用c#語法,會建立乙個派生自抽象基類array的新類。

建立陣列

array是乙個抽象類,所以不能使用建構函式來建立陣列。

除了使用c#語法建立陣列例項之外,還可以使用靜態方法createinstance()建立陣列。如果事先不知道元素的型別,該靜態方法就非常有用,因為型別可以作為type物件傳遞給createinstance()方法。

arrray intarray = array.createinstance(typeof(int), 5);

for (int i=0; i<5; i++)

還可以將已建立的陣列強制轉換成宣告為int的陣列;

int intarraycopy = (int) intarray;

複製陣列(轉殖陣列)

int intarrayclone = (int) intarray.clone();

排序array類使用quicksort演算法對陣列中的元素進行排序。

sort()方法需要陣列中的元素實現icomparable介面。 因為簡單型別(如system.string 和 system.int32)實現icomparable介面,所以可以對包含這些型別的元素排序。

eg:string names =;

array.sort(names);

foreach (var name in names)

如果對陣列使用自定義類,就必須實現icomparable介面或icomparer介面。

這兩個介面只定義了乙個方法compareto(),如果要比較的物件相等,該方法就返回0;如果該例項應該排在引數物件的前面,該方法就返回小於0的值,如果排在後面,反之。

eg:public class person : icomparable

return result;}}

array類還提供了sort方法,它需要講乙個委託作為引數。這個引數傳遞給方法,從而比較兩個物件,而不需要依賴icomparable或icomparer介面。

陣列作為引數

陣列協變

陣列支援協變。 這表示陣列可以宣告為基類,其派生型別的元素可以賦予陣列元素。

陣列協變只能用於引用型別,不能用於值型別。另外,陣列協變有乙個問題,它只能通過執行時異常來解決。

arraysegment

該結構表示陣列的一段。如果需要使用不同的方法處理某個大型陣列的不同部分,那麼可以把相應的陣列部分複製到各個方法中。此時,與建立多個陣列下你個比,更有效的方法是使用乙個陣列,將整個陣列傳遞給不同的方法。這些方法只使用陣列的某個部分。方法的引數除了陣列以外,還應該包括陣列內的偏移量以及該方法應該使用的元素數。這樣一來,方法就需要至少3個引數。當時用陣列段時,只需要乙個引數就可以了。

列舉在 foreach 語句中使用列舉,可以迭代集合中的元素,且無須知道集合中的元素個數。

foreach 語句使用了乙個列舉器。

陣列或結合實現了 帶geteumerator()方法的 ieumerable 介面。geteumerator()方法返回乙個實現 ieumerable 介面的列舉。接著, foreach 語句就可以使用 ieumerable 介面迭代集合了。

ienumerator介面

foreach 語句使用ienumerator介面的方法和屬性,迭代集合中的所有元素。

為此,ienumerator定義了current屬性,來返回游標所在的元素,該介面的movenext()方法移動到集合的下乙個元素上,如果有這個元素,該方法就返回true。如果集合不在有更多的元素,該方法就返回false。

foreach語句

c#的foreach語句不會解析為il**中的foreach語句。c#編譯器會把foreach語句轉換為ienumerable介面的方法和屬性。

eg:foreach (var p in persons)

foreach 語句的解析過程: 首先,呼叫getenumerator()方法,獲得陣列的乙個列舉器。在while迴圈中 ---------- 只要movenext()返回true ---------- 就用current屬性訪問陣列中的元素;

ienumeratorenumerator = persons.getenumerator();

while ( enumerator.movenext() )

yield語句

在c# 1.0中,建立列舉器仍需要做大量的工作。c# 2.0新增了yield語句,以便於建立列舉器。yield return語句返回集合的乙個元素,並移動到下乙個元素上。yield break 可以停止迭代。

eg:using system;

using system,collections;

namespace wrox.procsharp.arrays }}

包含yield語句的方法或屬性也稱為迭代塊。迭代塊必須宣告為返回ienumerator或ienumerable介面,或者這些介面的泛型版本。這個塊可以包含多條 yield return 語句或 yield break 語句,但不能包含return語句。

現在可以用foreach語句迭代集合了:

public void helloworld()

}yeild語句會生成乙個列舉器,而不僅僅生成乙個包含的項的列表,這個列舉器通過foreach語句呼叫。從foreach中依次訪問每一項時,就會訪問列舉器。這樣就可以迭代大量的資料,而無須一次把所有的資料都讀入記憶體。

【未完懶得寫了。。。。。 有時間再來填坑吧】

《Lua程式設計 第4版 》 第9章練習答案

lua的閉包真的很強大!function derivative f,delta delta delta or 1e 5 return function x return f x delta f x delta endendfunction integral f,delta delta delta o...

《好學的C 第2版》 第9章 一些高階程式設計技術

轉向c 0x和oop之前,需要掌握其他一些技巧。c 命令列引數 main函式須這樣定義 int main int argc,char ar argc計數包括程式名,所以至少是1 ar 0 就是程式名。這兩個引數可以任意使用,但是是唯讀的,可以隨意顯示或複製它們。程式中可以通過argc判斷輸入引數是否...

C 高階程式設計 第7版 筆記 第3章物件與型別

本章新知識點有 1 擴充套件方法 有許多擴充套件類的方式。如果有類的源 繼承就是給物件新增功能的好方法。但如果沒有源 該怎麼辦?此時可以使用擴充套件方法,它允許改變乙個類,但不需要該類的源 擴充套件方法是靜態方法,它是類的一部分,但實際上沒有放在類的源 中。假定上例中的money類需要乙個方法add...