1. 數組(Array) 數組是一個存儲相同類型元素的固定大小的順序集合。數組是用來存儲數據的集合,通常認為數組是一個同一類型變數的集合。 聲明數組變數並不是聲明 number0、number1、...、number99 一個個單獨的變數,而是聲明一個就像 numbers 這樣的變數,然後使用 nu ...
數組是一個存儲相同類型元素的固定大小的順序集合。數組是用來存儲數據的集合,通常認為數組是一個同一類型變數的集合。
聲明數組變數並不是聲明 number0、number1、...、number99 一個個單獨的變數,而是聲明一個就像 numbers 這樣的變數,然後使用 numbers[0]、numbers[1]、...、numbers[99] 來表示一個個單獨的變數。數組中某個指定的元素是通過索引來訪問的。
所有的數組都是由連續的記憶體位置組成的。最低的地址對應第一個元素,最高的地址對應最後一個元素。
聲明數組
在 C# 中聲明一個數組,您可以使用下麵的語法:
datatype[] arrayName;
其中,
-
datatype 用於指定被存儲在數組中的元素的類型。
-
[ ] 指定數組的秩(維度)。秩指定數組的大小。
-
arrayName 指定數組的名稱。
例如:
double[] balance;
初始化數組
聲明一個數組不會在記憶體中初始化數組。當初始化數組變數時,您可以賦值給數組。
數組是一個引用類型,所以您需要使用 new 關鍵字來創建數組的實例。
例如:
double[] balance = new double[10];
賦值給數組
您可以通過使用索引號賦值給一個單獨的數組元素,比如:
double[] balance = new double[10]; balance[0] = 4500.0;
您可以在聲明數組的同時給數組賦值,比如:
double[] balance = { 2340.0, 4523.69, 3421.0};
您也可以創建並初始化一個數組,比如:
int [] marks = new int[5] { 99, 98, 92, 97, 95};
在上述情況下,你也可以省略數組的大小,比如:
int [] marks = new int[] { 99, 98, 92, 97, 95};
您也可以賦值一個數組變數到另一個目標數組變數中。在這種情況下,目標和源會指向相同的記憶體位置:
int [] marks = new int[] { 99, 98, 92, 97, 95}; int[] score = marks;
當您創建一個數組時,C# 編譯器會根據數組類型隱式初始化每個數組元素為一個預設值。例如,int 數組的所有元素都會被初始化為 0。
訪問數組元素
元素是通過帶索引的數組名稱來訪問的。這是通過把元素的索引放置在數組名稱後的方括弧中來實現的。例如:
double salary = balance[9];
下麵是一個實例,使用上面提到的三個概念,即聲明、賦值、訪問數組:
實例
static void Main(string[] args) { int [] n = new int[10]; /* n 是一個帶有 10 個整數的數組 */ int i,j; /* 初始化數組 n 中的元素 */ for ( i = 0; i < 10; i++ ) { n[ i ] = i + 100; } /* 輸出每個數組元素的值 */ for (j = 0; j < 10; j++ ) { Console.WriteLine("Element[{0}] = {1}", j, n[j]); } Console.ReadKey(); }
當上面的代碼被編譯和執行時,它會產生下列結果:
Element[0] = 100 Element[1] = 101 Element[2] = 102 Element[3] = 103 Element[4] = 104 Element[5] = 105 Element[6] = 106 Element[7] = 107 Element[8] = 108 Element[9] = 109
2. 集合
集合(Collection)類是專門用於數據存儲和檢索的類。這些類提供了對棧(stack)、隊列(queue)、列表(list)和哈希表(hash table)的支持。大多數集合類實現了相同的介面。
集合(Collection)類服務於不同的目的,如為元素動態分配記憶體,基於索引訪問列表項等等。這些類創建 Object 類的對象的集合。在 C# 中,Object 類是所有數據類型的基類。
各種集合類和它們的用法
下麵是各種常用的 System.Collection 命名空間的類。點擊下麵的鏈接查看細節。
類 | 描述和用法 |
---|---|
它代表了可被單獨索引的對象的有序集合。它基本上可以替代一個數組。但是,與數組不同的是,您可以使用索引在指定的位置添加和移除項目,動態數組會自動重新調整它的大小。它也允許在列表中進行動態記憶體分配、增加、搜索、排序各項。 | |
它使用鍵來訪問集合中的元素。當您使用鍵訪問元素時,則使用哈希表,而且您可以識別一個有用的鍵值。哈希表中的每一項都有一個鍵/值對。鍵用於訪問集合中的項目。 | |
它可以使用鍵和索引來訪問列表中的項。排序列表是數組和哈希表的組合。它包含一個可使用鍵或索引訪問各項的列表。如果您使用索引訪問各項,則它是一個動態數組(ArrayList),如果您使用鍵訪問各項,則它是一個哈希表(Hashtable)。集合中的各項總是按鍵值排序。 | |
它代表了一個後進先出的對象集合。當您需要對各項進行後進先出的訪問時,則使用堆棧。當您在列表中添加一項,稱為推入元素,當您從列表中移除一項時,稱為彈出元素。 | |
它代表了一個先進先出的對象集合。當您需要對各項進行先進先出的訪問時,則使用隊列。當您在列表中添加一項,稱為入隊,當您從列表中移除一項時,稱為出隊。 | |
它代表了一個使用值 1 和 0 來表示的二進位數組。當您需要存儲位,但是事先不知道位數時,則使用點陣列。您可以使用整型索引從點陣列集合中訪問各項,索引從零開始。 |
1. 動態數組(ArrayList)
動態數組(ArrayList)代表了可被單獨索引的對象的有序集合。它基本上可以替代一個數組。但是,與數組不同的是,您可以使用索引在指定的位置添加和移除項目,動態數組會自動重新調整它的大小。它也允許在列表中進行動態記憶體分配、增加、搜索、排序各項。
ArrayList 類的方法和屬性
下表列出了 ArrayList 類的一些常用的 屬性:
屬性 | 描述 |
---|---|
Capacity | 獲取或設置 ArrayList 可以包含的元素個數。 |
Count | 獲取 ArrayList 中實際包含的元素個數。 |
IsFixedSize | 獲取一個值,表示 ArrayList 是否具有固定大小。 |
IsReadOnly | 獲取一個值,表示 ArrayList 是否只讀。 |
IsSynchronized | 獲取一個值,表示訪問 ArrayList 是否同步(線程安全)。 |
Item[Int32] | 獲取或設置指定索引處的元素。 |
SyncRoot | 獲取一個對象用於同步訪問 ArrayList。 |
下表列出了 ArrayList 類的一些常用的 方法:
序號 | 方法名 & 描述 |
---|---|
1 | public virtual int Add( object value ); 在 ArrayList 的末尾添加一個對象。 |
2 | public virtual void AddRange( ICollection c ); 在 ArrayList 的末尾添加 ICollection 的元素。 |
3 | public virtual void Clear(); 從 ArrayList 中移除所有的元素。 |
4 | public virtual bool Contains( object item ); 判斷某個元素是否在 ArrayList 中。 |
5 | public virtual ArrayList GetRange( int index, int count ); 返回一個 ArrayList,表示源 ArrayList 中元素的子集。 |
6 | public virtual int IndexOf(object); 返回某個值在 ArrayList 中第一次出現的索引,索引從零開始。 |
7 | public virtual void Insert( int index, object value ); 在 ArrayList 的指定索引處,插入一個元素。 |
8 | public virtual void InsertRange( int index, ICollection c ); 在 ArrayList 的指定索引處,插入某個集合的元素。 |
9 | public virtual void Remove( object obj ); 從 ArrayList 中移除第一次出現的指定對象。 |
10 | public virtual void RemoveAt( int index ); 移除 ArrayList 的指定索引處的元素。 |
11 | public virtual void RemoveRange( int index, int count ); 從 ArrayList 中移除某個範圍的元素。 |
12 | public virtual void Reverse(); 逆轉 ArrayList 中元素的順序。 |
13 | public virtual void SetRange( int index, ICollection c ); 複製某個集合的元素到 ArrayList 中某個範圍的元素上。 |
14 | public virtual void Sort(); 對 ArrayList 中的元素進行排序。 |
15 | public virtual void TrimToSize(); 設置容量為 ArrayList 中元素的實際個數。 |
static void Main(string[] args) { ArrayList al = new ArrayList(); Console.WriteLine("Adding some numbers:"); al.Add(45); al.Add(78); al.Add(33); al.Add(56); al.Add(12); al.Add(23); al.Add(9); Console.WriteLine("Capacity: {0} ", al.Capacity); Console.WriteLine("Count: {0}", al.Count); Console.Write("Content: "); foreach (int i in al) { Console.Write(i + " "); } Console.WriteLine(); Console.Write("Sorted Content: "); al.Sort(); foreach (int i in al) { Console.Write(i + " "); } Console.WriteLine(); Console.ReadKey(); }
當上面的代碼被編譯和執行時,它會產生下列結果:
Adding some numbers: Capacity: 8 Count: 7 Content: 45 78 33 56 12 23 9 Sorted Content: 9 12 23 33 45 56 78
3. 使用 foreach 迴圈
在前面的實例中,我們使用一個 for 迴圈來訪問每個數組元素。您也可以使用一個 foreach 語句來遍曆數組。
實例
static void Main(string[] args) { int [] n = new int[10]; /* n 是一個帶有 10 個整數的數組 */ /* 初始化數組 n 中的元素 */ for ( int i = 0; i < 10; i++ ) { n[i] = i + 100; } /* 輸出每個數組元素的值 */ foreach (int j in n ) { int i = j-100; Console.WriteLine("Element[{0}] = {1}", i, j); } Console.ReadKey(); }
當上面的代碼被編譯和執行時,它會產生下列結果:
Element[0] = 100 Element[1] = 101 Element[2] = 102 Element[3] = 103 Element[4] = 104 Element[5] = 105 Element[6] = 106 Element[7] = 107 Element[8] = 108 Element[9] = 109
4. C# 數組細節
在 C# 中,數組是非常重要的,且需要瞭解更多的細節。下麵列出了 C# 程式員必須清楚的一些與數組相關的重要概念:
概念 | 描述 |
---|---|
C# 支持多維數組。多維數組最簡單的形式是二維數組。 | |
您可以通過指定不帶索引的數組名稱來給函數傳遞一個指向數組的指針。 | |
這通常用於傳遞未知數量的參數給函數。 |
1. 多維數組
C# 支持多維數組。多維數組又稱為矩形數組。
您可以聲明一個 string 變數的二維數組,如下:
string [,] names;
或者,您可以聲明一個 int 變數的三維數組,如下:
int [ , , ] m;
二維數組
多維數組最簡單的形式是二維數組。一個二維數組,在本質上,是一個一維數組的列表。
一個二維數組可以被認為是一個帶有 x 行和 y 列的表格。下麵是一個二維數組,包含 3 行和 4 列:
初始化二維數組
多維數組可以通過在括弧內為每行指定值來進行初始化。下麵是一個帶有 3 行 4 列的數組。
int [,] a = new int [3,4] { {0, 1, 2, 3} , /* 初始化索引號為 0 的行 */ {4, 5, 6, 7} , /* 初始化索引號為 1 的行 */ {8, 9, 10, 11} /* 初始化索引號為 2 的行 */ };
訪問二維數組元素
二維數組中的元素是通過使用下標(即數組的行索引和列索引)來訪問的。例如:
int val = a[2,3];
上面的語句將獲取數組中第 3 行第 4 個元素。您可以通過上面的示意圖來進行驗證。讓我們來看看下麵的程式,我們將使用嵌套迴圈來處理二維數組:
static void Main(string[] args) { /* 一個帶有 5 行 2 列的數組 */ int[,] a = new int[5, 2] {{0,0}, {1,2}, {2,4}, {3,6}, {4,8} }; int i, j; /* 輸出數組中每個元素的值 */ for (i = 0; i < 5; i++) { for (j = 0; j < 2; j++) { Console.WriteLine("a[{0},{1}] = {2}", i, j, a[i,j]); } } Console.ReadKey(); }
當上面的代碼被編譯和執行時,它會產生下列結果:
a[0,0]: 0 a[0,1]: 0 a[1,0]: 1 a[1,1]: 2 a[2,0]: 2 a[2,1]: 4 a[3,0]: 3 a[3,1]: 6 a[4,0]: 4 a[4,1]: 8
2. 傳遞數組給函數
在 C# 中,您可以傳遞數組作為函數的參數。您可以通過指定不帶索引的數組名稱來給函數傳遞一個指向數組的指針。
public static double getAverage(int[] arr, int size) { int i; double avg; int sum = 0; for (i = 0; i < size; ++i) { sum += arr[i]; } avg = (double)sum / size; return avg; } static void Main(string[] args) { MyArray app = new MyArray(); /* 一個帶有 5 個元素的 int 數組 */ int [] balance = new int[]{1000, 2, 3, 17, 50}; double avg; /* 傳遞數組的指針作為參數 */ avg = getAverage(balance, 5 ) ; /* 輸出返回值 */ Console.WriteLine( "平均值是: {0} ", avg ); Console.ReadKey(); }
當上面的代碼被編譯和執行時,它會產生下列結果:
平均值是: 214.4
3. 參數數組
有時,當聲明一個方法時,您不能確定要傳遞給函數作為參數的參數數目。C# 參數數組解決了這個問題,參數數組通常用於傳遞未知數量的參數給函數。
params 關鍵字
在使用數組作為形參時,C# 提供了 params 關鍵字,使調用數組為形參的方法時,既可以傳遞數組實參,也可以傳遞一組數組元素。params 的使用格式為:
public 返回類型 方法名稱( params 類型名稱[] 數組名稱 )
public static int AddElements(params int[] arr) { int sum = 0; foreach (int i in arr) { sum += i; } return sum; } static void Main(string[] args) { ParamArray app = new ParamArray(); int sum = app.AddElements(512, 720, 250, 567, 889); Console.WriteLine("總和是: {0}", sum); Console.ReadKey(); }
當上面的代碼被編譯和執行時,它會產生下列結果:
總和是: 2938
5. 作業
-
求兩個二維數組的和
1 3 5 2 4 6
7 9 2 + 8 9 7 = ?
4 6 8 3 5 1
數組A 數組B 數組C -
假設一個數組共有20個元素,其中前5位元素是:1,1,2,3,5..... 列印出數組的第20位元素的值。
-
創建一個
ArrayList
集合對象,迴圈10次向集合中添加10個元素。 -
將第三題的集合按從大到小的順序進行輸出(可直接調用現成的集合封裝好的方法)。
視頻教程:
譽尚學教育_譽尚學教育騰訊課堂官網 (qq.com)
或者:C# 最強入門編程(.Net 學習系列開山巨作)_嗶哩嗶哩_bilibili