程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#數組的屬性、foreach遍歷、交錯數組與矩形數組的區別

C#數組的屬性、foreach遍歷、交錯數組與矩形數組的區別

編輯:關於C#

本次課我們要學習數組的屬性、foreach的用法、我上節課提到的交錯數組,我會通過多個例子的演示講解讓你們理解交錯數組定義已經與 規則的二維數組(矩形數組)的區別加深理解,下一節我們還將學習數組的常用方法。

下面我們來學習一下數組的屬性,什麼是屬性呢?在 以後學習類的時候我會給大家詳細的講解,現在我給你們舉個現實生活的例子,幫助你們理解什麼叫屬性,屬性一般都是名詞,表示它的所有 者(即對象)擁有的特性,如抹布(對象)的顏色、大小(屬性),而下一節將學習的數組的方法一般是動詞,如抹布的功能,抹布(對象) 清除(方法)桌面、車輛、地面(這些動作的賓語也可以比喻成以後要學習的參數),現在你們就記住屬性是描述對象的特性的,一般是名詞 ,方法是描述對象功能的,一般是動詞。那數組有哪些屬性呢?

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

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

在上一節最後一個例子時我們用到了通過索引(index)得到數組元素 的值Array[index],但是當數組的維數、容量較多時,采用索引這種方法就會繁雜,不僅代碼量大也會降低編程效率,針對這個問題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維數組a
for (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維數組a
foreach(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的最大值<names.Length,存 儲後,提示“輸出學生姓名”,再用foreach循環一次性遍歷names數組中存儲的每個元素(學生的姓名),一個一個的把它賦值給 name元素,然後輸出到控制台上。

通過這個例 子,我們復習了在c語言中就學到的for循環,用索引方式存儲數組元素的值,以及今天學習的.length屬性、foreach遍歷的用法,必須注意的 是,借助foreach,只能一一取得數組中的元素,並不能利用這種語句改變數組所存儲的元素。做個foreach和for的使用是你必須熟練掌握的編 程技能,同學們要引起重視。

下面我們來學習交錯數組,也稱鋸齒形數組,是一種不規則的二維數組,它與矩形數組(二維數組)最大 的差異,在於數組中每一行的長度並不相同,我們可以把它想象成有不同長度的一維數組組合而成的二維數組,所以交錯數組也被稱為“ 數組中的數組”,它比規格的矩形數組節省了內存空間,當同時也要在創建和使用時按照其特點進行操作。創建交錯數組所使用的語法不 同於前面的矩形數組,必須使用兩個[]運算符,第一個代表[n]代表行數。看下面的圖片,用圖片的實例為大家講解交錯數組的聲明。

交錯數組聲明:行是固定的

第一步: int[][] jaggedArray = new int[4][];

如果采用分布聲明數組元素方式,元素的個數必須書寫,因為交錯數組的行是固定的,而每行 的列是不固定的,所以在初始化時必須在第一個[]中寫明行數4.

第二步:交錯數組每行初始化

jaggedArray[0] = new int[6];
jaggedArray[1] = new int[2];
jaggedArray[2] = new int[3];
jaggedArray[3] = new int[5];

給 每行看出一個一維數組,再定義列數,然後再給你可以采用索引賦值法,給單個元素賦值。如:

第三步:采用索引賦值法,給單個元素 賦值

jaggedArray[2][0] = 5;
jaggedArray[3][4] = 32;

或者你可以將上面的二、三步合並為一步,為每 一行都賦值。

第二步:直接給交錯數組初始化賦值
jaggedArray[0] = new int[] { 1, 3, 5, 7, 9,13 };
jaggedArray[1] = new int[] { 0, 2, };
jaggedArray[2] = new int[] { 5,11, 22 };
jaggedArray[3] = new int[] { 3,5,7,10, 32 };

我們還可以在聲明數組時將其初始化,如:

int[][] jaggedArray = new int[][]
{
new int[] {1,3,5,7,9},
new int[] {0,2},
new int[] {5,11, 22 },
new int[] {3,5,7,10, 32}
};

下面我們來做一個給交錯數組賦值以及遍歷交錯數組的例子,讓我們體會一下和規則數組的代碼區別。我來解釋一下下面 的例子,我定義了3行的交錯數組,第一行輸出姓名、口頭禅、籍貫,第二行用直接賦值法定義了3列分別是劉大夫、很是費解、迪斯尼,第三 行只定義了2列,按照索引方式給3行1列的元素賦值為蠟筆小新、用索引的方式說賦的下一個值為給行索引為2列索引為1的元素賦值為老婆!

string[][] xinxi = new string[3][];
Console.WriteLine("正在給交錯數組賦值!");
xinxi[0] =new string [] {"姓  名","口頭禅","籍  貫"};
xinxi[1] = new string[] { "劉大夫", "很是費勁","《一日一囧》"};
xinxi[2] = new string[2];             
xinxi[2][0] = "蠟筆小新";
xinxi[2][1] = "老婆!";
Console.WriteLine("現在准備輸出!");
Console.WriteLine("*************");
foreach(string []hang in xinxi )//因為交錯數組的特性必須先用數組hang存儲 遍歷出交錯數組xinxi的每一行
{
foreach (stringlie in hang)//在行的數組中遍歷每一列存儲在lie元素中
{
Console.Write(lie);//輸出遍歷的元素
}
Console.WriteLine();
}

結果顯示為:

我們把上面的例子修改一下用for循環輸出元素,讓我們體 會一下交錯數組和規則數組的區別。

交錯數組:string[][] xinxi = new string[3][];

Console.WriteLine("正在 給交錯數組賦值!");
xinxi[0] = new string[] { " 姓  名 ", " 口頭禅 ", " 籍  貫  " };
xinxi[1] = new string[] { " 劉 大 夫 ", " 很是費勁" , " 《一日一囧》" };
xinxi[2] = new string[2];
xinxi[2][0] = " 蠟筆小新 ";
xinxi[2][1] = " 老婆!";
Console.WriteLine("現在准備輸出!");
Console.WriteLine("******************************");
for (int i = 0; i < xinxi.Length;i++ )//先得到行索引
{
for (int j = 0; j < xinxi[i].Length; j++)//得到行中的列索 引
{
if (xinxi[i][j] != null)           //如果此元素不為空時輸出元素值
{
Console.Write(xinxi [i][j]);
}
else
{
Console.Write("-------");      //如果此元素為空時輸出“------- ”
}
}
Console.WriteLine();
}

輸出結果和上一張圖片結果一致。而如果把第三行的列元素定義 為3時,此數組變成了規則的3行3列的二維數組,還是賦索引為0和1的元素值時:

二維數組:

string[][] xinxi = new string[3][];
Console.WriteLine("正在給二維數組賦值!");
xinxi[0] = new string[] { " 姓  名  ", " 口頭禅 ", " 籍  貫 " };
xinxi[1] = new string[] { " 劉 大 夫 ", " 很 是費勁" , " 《一日一囧》" };
xinxi[2] = new string[3];
xinxi[2][0] = " 蠟筆小新 ";
xinxi[2][1] = " 老婆!";
Console.WriteLine("現在准備輸出!");
Console.WriteLine ("******************************");
for (int i = 0; i < xinxi.Length;i++ )//先得到行索引
{
for (int j = 0; j < xinxi[i].Length; j++)//得到行中的列索引
{
if (xinxi[i][j] != null)           //如果此 元素不為空時輸出元素值
{
Console.Write(xinxi[i][j]);
}
else
{
Console.Write("------- ");      //如果此元素為空時輸出“-------”
}
}
Console.WriteLine();
}

結果如下圖片:

提問:區別下兩張圖片發現了 什麼?二維數組的第3行第3列我們沒有賦值,但是會出現————,說明它在創建的時候給這個位置的元素占位了,只 是根據上節課說的原則按照數據類型給了一個默認的null值,當我們用“------”取代時,能夠顯示出來,而交錯數組,沒有創建 元素的位置時,它是不存在的。

本節我們主要是學習foreach在兩種數組中的遍歷,下一節我們來學習數組的常用方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved