C#每日一課(十三)
C#陣列 Array
陣列是一個儲存相同型別元素的固定大小的順序集合。陣列是用來儲存資料的集合,通常認為陣列是一個同一型別變數的集合。
宣告陣列變數並不是每一個元素單獨進行宣告,而是宣告一個數組變數,然後使用下標來表示一個一個單獨的變數。如陣列變數numbers,它每一個元素是numbers[0]、numbers[1]、numbers[2]……,numbers[n].
陣列宣告
datatype[] arrayName;
datatype:用於指定被儲存在陣列中的元素的型別。
[]:指定陣列的維度,其中可以指定陣列元素的多少。
arrayName:指定陣列的名稱
陣列初始化
宣告一個數組不會在記憶體中初始化陣列。當初始化陣列變數時,可以進行賦值給到陣列。
- 陣列是一個引用型別,在需要使用時可以使用new關鍵字來建立陣列例項。
如:int[] num = new int[10];
- 可以通過索引來賦值給一個單獨的陣列元素
int[] num = new int[10];
int[0] = 0;(注意:C#中陣列的索引是從0開始的)
- 可以在宣告陣列的同時給陣列進行賦值
int[] num = {0,1,2,3};
- 可以建立並初始化一個數組
int[] num = new int[4]{0,1,2,3};
在上面這種情況下也可以省略陣列的大小,系統會根據初始化陣列時的元素個數自動計算陣列的大小。
- 可以把一個數組變數賦值給到另一個數組變數,這樣目標陣列與源陣列會指向同一記憶體地址
int[] num = new int[]{0,1,2,3};
int[] numbers = num;
注意:當使用new關鍵字進行陣列建立時,C#編譯器會根據陣列型別為陣列中的每一個元素初始化預設值,比如int型別陣列初始化時會初始化為0。
陣列元素訪問
陣列中的元素是通過還索引的陣列名來訪問的。這是通過把索引放在陣列名後的方括號中來實現。
如 int n = num[1];
使用visual studiou新增一個C#控制檯應用程式Chapter08_001
在Main方法中新增如下程式碼:
//陣列 宣告、賦值、訪問
//n是一個帶10個整數的陣列
int[] n = new int[10];
int i, j;
//初始化陣列n中的元素
for (i = 0; i < 10; i++) {
//使用for迴圈遍歷陣列中每一個元素並對元素進行賦值
n[i] = i + 10;
}
//訪問陣列中的每一個元素,並在控制檯列印輸出
for (j = 0; j < 10; j++) {
Console.WriteLine("n[{0}] = {1}", j, n[j]);
}
Console.ReadKey();
編譯執行後結果如下:
上面的程式碼體現了一個常規陣列的宣告、賦值、訪問的過程
陣列foreach迴圈
上面的程式碼使用了for迴圈對陣列中的每一個元素進行了遍歷,可以使用foreach來代替這種迴圈遍歷
在Main方法中加入foreach迴圈模組:
//使用foreach迴圈遍歷陣列元素
Console.WriteLine("------------使用foreach迴圈遍歷陣列元素-------------");
int cnt = 0;
foreach (int k in n) {
Console.WriteLine("n[{0}] = {1}",cnt++,k);
}
編譯執行後結果如下:
上面說了一些關於陣列的最基本的操作,下面再介紹一些關於陣列必須掌握的知識
多維陣列
多維陣列最簡單的形式是二維陣列,一個二維陣列,在本質上,是一個一維陣列的列表。
C#中的二維陣列
陣列中的每個元素是使用形式為arr[i,j]的元素名稱來標識的。
arr:表示的是陣列的名稱
i,j:是維一標識arr中每個元素的下標
初始化二維陣列
多維陣列可以通過在括號內為每行指定值來進行初始化,比如下面的陣列是一個三行四列的二維陣列。
int [,] arr =int [3,4] = {
{0,1,2,3},
{4,5,6,7},
{8,9,10,11}
};
二維陣列元素訪問
二維陣列中元素是通過使用下標(行索引和列索引一起)來訪問的。如:
int num = arr[2,3]; //這裡是把arr陣列中的第三行第四列資料取出並賦值給到變數num
在Main方法中加入如下程式碼:
Console.WriteLine("-------------二維資料測試-------------");
//宣告並初始化一個3行2列的二維陣列
int[,] arr = new int[3, 2] { {1,2},{3,4},{5,6} };
int row, col;
//在控制檯列印陣列中的每一個元素
int rows = Convert.ToInt32(arr.GetLongLength(0));//注意:這裡的維度從0開始計算
int cols = Convert.ToInt32(arr.GetLongLength(1));
for (row = 0; row < arr.GetLongLength(0); row++) {
for (col = 0; col < cols; col++) {
Console.WriteLine("arr[{0}][{1}] = {2}",row,col,arr[row,col]);
}
}
編譯執行後結果如下:
交錯陣列
交錯陣列表示的是陣列的陣列。
比如:int [][] scores;
宣告一個數組並不會在記憶體中建立陣列,要建立陣列可以如下
int[][] scores = new int[5][];
for(int i=0;i<scores.length;i++)
{
scores[i] = new int[4];
}
初始化一個交錯陣列可以如下進行:
int[][] scores = new int[2][]{new int[]{1,2,3},new int[]{4,5,6,7}};
上面這個交錯陣列表示:
scores是一個由兩個整型陣列組成的陣列,其中scores[0],是一個帶有3個整型的陣列,scroes[1],是一個帶有4個整數的陣列。
C#中傳遞陣列給方法
在C#中,可以傳遞陣列作為函式的引數,也可以通過指定不還索引的陣列名來給函式傳遞一個指向陣列的指標。
引數陣列
當宣告一個方法時,如果不確定要傳給方法作為引數的引數個數,可以使用引數陣列,它通常是用來傳遞未知數量的引數給函式。
params引數
在使用陣列作為形參時,C#提供了params關鍵字,使呼叫陣列形參的方法時同,既可以傳自遞陣列實參,也可以只傳遞一組數。
public 返回型別 方法名稱(params 型別名稱[] 陣列名稱)
在程式新建如下方法:
public static int AddElements(params int[] arr) {
int sum = 0;
foreach (int i in arr)
{
sum += i;
}
return sum;
}
在Main方法中對引數陣列方法的呼叫可以使用如下兩個方法進行:
Console.WriteLine("---------------引數陣列呼叫-----------------");
int sum = AddElements(1, 2, 3, 4, 5);
Console.WriteLine("使用一組數來進行傳遞求和:{0}",sum);
int[] param = new int[] { 1, 2, 3, 4, 5 };
sum = AddElements(param);
Console.WriteLine("使用陣列來進行傳遞求和:{0}", sum);
編譯執行後結果如下:
C#中Array類
Array類是所有C#中陣列的基類,它在System名稱空間中定義。它提供了各種用於陣列的屬性和方法。
Array類常用屬性:
IsFixedSize:獲取一個值,這個值表示陣列是否帶有固定的大小
IsReadOnly:獲取一個值,這個值指示陣列是否只讀
Length:獲取一個32位整數,這個值表示所有維度的陣列中的元素總數
LongLength:獲取一個64位整數,表示所有維度的陣列中元素總數
Rank:獲取陣列的秩(維度)
Array類中常用方法:
Clear:根據元素的型別,設定陣列中某個範圍的元素為零、為false或者null
Copy(Array,Array,Int32):從陣列的第一個元素開始複製某個範圍的元素到另一個數組的第一個元素位置,長度由後面的32位整數決定
CopyTo(Array,Int32):從當前的一維陣列中複製出所有元素到一個指定的一維陣列的指定索引位置,索引位置由後面的32位整數決定
GetLength:獲取一個32位整數,表示指定維度的陣列中的元素總數
GetLongLength:獲取一個64位整數,這個值表示指定維度的陣列中的元素總和
GetLowerBound:獲取陣列中指定維度的下界
GetType:獲取當前例項的型別
GetUpperBound:獲取陣列中指定維度的上界
GetValue(Int32):獲取一維陣列中指定位置的值,索引由32位整數指定
IndexOf(Array,object):搜尋指定的物件,返回整個一維陣列中第一次出現的索引
Reverse(Array):反轉整個一維陣列中元素順序
SetValue(Object,Int32):給一維陣列中指定位置的元素設定值,索引由一個32位整數指定
Sort(Array):使用陣列的每個元素的IComparable實現排序整個一維陣列中的元素
ToString:返回一個表示當前物件的字串