C#快速入門教程(19)—— 索引器與陣列
陣列(array)是將一組型別相同的資料進行統一組織、管理和使用的一種形式,定義和初始化一個陣列時,需要指定資料成員的資料型別及成員數量,如下面的程式碼就定義了一個包含10個int資料的陣列。
int[] arr = new int[10];
使用陣列時,還需要注意一點,其索引值是從0開始的,也就是說,定義了10個成員的陣列,其成員索引值是從0到9,如下面的程式碼,我們通過一個for迴圈結構分別給arr陣列成員賦值。
static void Main(string[] args)
{
int[] arr = new int[10];
for (int i = 0; i < 10; i++)
{
arr[i] = (int)Math.Pow(2, i);
}
// 顯示資料
for (int i = 0; i < 10; i++)
{
Console.WriteLine(arr[i]);
}
}
程式碼中將索引值也當做指數,分別計算了2的0到9次方的結果,執行結果如下圖所示。
實際應用中,如果陣列的成員是已知的或沒有規律的,也可以在定義陣列時直接指定成員的值,如下面的程式碼。
static void Main(string[] args)
{
int[] arr = { 1, 1, 2, 3, 5 };
// 顯示資料
foreach(int n in arr)
{
Console.WriteLine(n);
}
}
本例中,我們使用一對花括號直接指定了陣列成員的陣列;而對於成員數量不明確的陣列,則可以使用foreach...in語句結構訪問其成員,如程式碼中那樣,其執行結果如下圖所示。
大家可以看到,陣列的應用,可以通過迴圈語句結構很方便的訪問成員,也可以對其成員進行相同或相似的操作;對於大量相關的資料操作,使用陣列是非常方便的,下面,我們將瞭解更多關於陣列的操作。
多維陣列
多維陣列可以處理如二維矩陣、三維矩陣此類的資料,如下面的程式碼就定義了一個3行4列的二維矩陣。
static void Main(string[] args)
{
int[,] matrix = new int[3,4];
//
for(int row=0;row<3;row++)
{
for(int col=0;col<4;col++)
{
Console.Write(" ({0},{1})", row, col);
}
Console.WriteLine();
}
}
程式碼執行結果如下圖所示。
直接指定多維陣列成員的資料時,注意維度的處理,如下面的程式碼同樣是定義了一個二矩陣資料結構。
static void Main(string[] args)
{
int[,] matrix = {
{ 1,2,3,4},
{5,6,7,8 },
{9,10,11,12 }
};
//
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 4; col++)
{
Console.Write(" ({0}) ", matrix[row, col]);
}
Console.WriteLine();
}
}
程式碼執行結果如下圖所示。
這裡,我們只討論了二維陣列的應用,實際開發中,維度增加時,資料處理的複雜程度會呈幾何級增長,所以,如果應用中需要處理多維資料,應注意資料結構的合理設計,使用迴圈語句結構訪問陣列成員時,迴圈控制變數一定要直觀,如示例中的row表示行、col表示列等。
Array類
實際上,我們定義的每一個陣列都會對映為Array物件,這樣一來,我們就可以使用Array類中定義的一系列成員來運算元組,如排序、反轉、獲取資料維數和成員數量等,下面的程式碼演示了Array類中幾個成員的使用。
static void Main(string[] args)
{
int[,] matrix = {
{ 1,2,3,4},
{5,6,7,8 },
{9,10,11,12 }
};
Console.WriteLine("陣列成員數量:{0}", matrix.Length);
Console.WriteLine("陣列的維度:{0}", matrix.Rank);
Console.WriteLine("陣列第一維的成員數量:{0}", matrix.GetLength(0));
}
程式碼執行結果如下圖所示。
本例中,我們使用了Array類的三個成員,分別是:
- Length屬性,返回陣列成員的數量,請注意,這裡是所有的成員,不考慮維度問題。此外,如果成員數量真的很多,還可以使用LongLength屬性獲取。
- Rank屬性,返回陣列的維度。
- GetLength()方法,返回指定維度的成員數量,請注意,第一維索引也是從0開始的。
關於Array類的更多操作,大家可幫助Microsoft的幫助文件。
自定義索引器
前面的內容都使用了從0開始的整數索引來訪問陣列成員,實際上,我們還可以在自己的型別中定義索引形式,這就是使用索引器(indexer)。
下面的程式碼,我們建立CFibonacci類,用於計算斐波那契數列。
namespace ConsoleTest
{
public class CFibonacci
{
public int this[int n]
{
get
{
if (n == 1 || n == 2)
{
return 1;
}
else if (n > 2)
{
int x = 1, y = 1;
int tmp = 0;
for (int i = 3; i <= n; i++)
{
tmp = x;
x = y;
y += tmp;
}
return y;
}
else
{
return 0;
}
}
}
}
}
本例中,我們在CFibonacci類中定義了一個索引器,大家可看到,索引器沒有名稱,而是使用this關鍵字,而索引器的索引資料使用一對方括號定義。這裡定義的索引器的功能就是用於返回斐波那契數列的第n個資料,下面的程式碼測試了此類的應用。
static void Main(string[] args)
{
CFibonacci fib = new CFibonacci();
for(int i=1;i<=10;i++)
{
Console.WriteLine(fib[i]);
}
}
程式碼用於顯示斐波那契數列的前10個數字,執行結果如下圖所示。
實際上,本例的執行效率並不高,大家可以思考一下為什麼?
問題就出在每次計算第n個數值時都會從第1個開始計算,如果需要從1到開始的連續資料,其效率並不高,下面,我們在CFibonacci類中新增GetSeq()方法,其功能是給出數列的前n個數值,並返回一個陣列。
public int[] GetSeq(int n)
{
if (n < 1) return new int[0];
//
int[] re = new int[n];
re[0] = 1;
if (n > 1) re[1] = 1;
//
if(n>2)
{
for(int i=2;i<n;i++)
{
re[i] = re[i - 2] +re[i - 1];
}
}
return re;
}
下面的程式碼測試了GetSeq()方法的使用。
static void Main(string[] args)
{
CFibonacci fib = new CFibonacci();
int[] arr = fib.GetSeq(10);
for (int i = 0; i < 10; i++)
{
Console.WriteLine(arr[i]);
}
}
程式碼執行結果如下圖所示。
實際應用中,索引資料還可以是其它型別的資料,如字串型別,後續的學習中可以看到相關的應用。
CHY軟體小屋原創作品!
相關文章
- Go 快速入門指南 - 陣列Go陣列
- 樹狀陣列快速入門陣列
- C#快速入門教程(25)—— 日期與時間C#
- Java入門教程七(陣列)Java陣列
- 《C#快速入門教程》目錄C#
- C#快速入門教程(16)—— 介面C#
- C#快速入門教程(6)——方法C#
- C#快速入門教程(5)——欄位與屬性C#
- C#快速入門教程(2)——程式碼與測試C#
- C#快速入門教程(20)—— 字串與正規表示式C#字串
- C#快速入門教程(26)—— 繪圖C#繪圖
- C#快速入門教程(21)—— 泛型C#泛型
- C#快速入門教程(15)—— 繼承C#繼承
- C#快速入門教程(8)——整數C#
- Go語言之陣列快速入門篇Go陣列
- C#快速入門教程(24)—— 路徑、目錄與檔案C#
- C#快速入門教程(17)—— 委託、事件與Lambda表示式C#事件
- C#快速入門教程(28)—— ADO.NETC#
- C#快速入門教程(22)—— 常用集合型別C#型別
- C#快速入門教程(30)—— 繼續學習C#
- C#快速入門教程(18)—— 異常處理C#
- C#快速入門教程(12)—— if語句結構C#
- C# unsafe 快速複製陣列C#陣列
- 【C#】山脈陣列的峰頂索引C#陣列索引
- C#快速入門教程(10)——布林型別與布林運算C#型別
- C#快速入門教程(27)—— SQL Server資料庫C#SQLServer資料庫
- C#快速入門教程(11)—— 字元和字串型別C#字元字串型別
- C#快速入門教程(13)—— switch語句結構C#
- C#快速入門教程(7)——資料型別概述C#資料型別
- 前端學習 資料結構與演算法 快速入門 系列 —— 陣列前端資料結構演算法陣列
- C#快速入門教程(23)—— using語句和IDisposable介面C#
- C#快速入門教程(14)—— 迴圈語句結構C#
- C#快速入門教程(4)——類成員的作用域C#
- C#快速入門教程(1)——物件導向程式設計C#物件程式設計
- Materialize快速入門教程
- C#快速入門教程(29)—— ADO.NET離線元件與資料繫結C#元件
- PHP入門之陣列PHP陣列
- C# 12 Blazor入門教程C#Blazor