C#教程7:数组
一、C# array數組定義
????????數組是數據的集合。標量變量一次只能保存一項。數組可以容納多個項目。這些項目稱為數組的元素。數組存儲相同數據類型的數據。每個元素都可以通過索引來引用。數組是從零開始的。第一個元素的索引為零。數組是引用類型。
????????數組用于存儲我們應用程序的數據。我們將數組聲明為某種數據類型。我們指定它們的長度。我們用數據初始化數組。我們有幾種處理數組的方法。我們可以修改元素、對其進行排序、復制或搜索它們。
int[] ages; String[] names; float[] weights;我們有三個數組聲明。聲明由兩部分組成。數組的類型和數組名稱。數組的類型具有確定數組中元素類型的數據類型(在我們的示例中為 int、String、float)和一對方括號 []。括號表示我們有一個數組。
集合具有類似的目的。它們比數組更強大。稍后將在單獨的章節中描述它們。
二、C#初始化數組
有幾種方法,我們可以如何在 C# 中初始化一個數組。
Program.cs
int[] array = new int[5];array[0] = 1; array[1] = 2; array[2] = 3; array[3] = 4; array[4] = 5;for (int i = 0; i < array.Length; i++) {Console.WriteLine(array[i]); }我們聲明并初始化一個數值數組。數組的內容被打印到控制臺。
int[] array = new int[5];這里我們聲明一個包含五個元素的數組。所有元素都是整數。
array[0] = 1; array[1] = 2; ...我們用一些數據初始化數組。這是賦值初始化。索引在方括號中。數字 1 將是數組的第一個元素,2 是第二個。
for (int i = 0; i < array.Length; i++) {Console.WriteLine(array[i]); }我們遍歷數組并打印它的元素。數組有一個 Length 屬性,它給出了數組中元素的數量。由于數組是從零開始的,因此索引是 0..length-1。
我們可以在一個語句中聲明和初始化一個數組。
Program.cs
int[] array = new int[] { 2, 4, 5, 6, 7, 3, 2 };foreach (int i in array) {Console.WriteLine(i); }這是先前程序的修改版本。
int[] array = new int[] {2, 4, 5, 6, 7, 3, 2 };一個數組在一個步驟中被聲明和初始化。元素在大括號中指定。我們沒有指定數組的長度。編譯器會為我們做這件事。
foreach (int i in array) {Console.WriteLine(i); }我們使用 foreach 關鍵字遍歷數組并打印其內容。
三、C#?數組訪問元素
創建數組后,可以通過索引訪問其元素。索引是放在數組名稱后面的方括號內的數字。
我們可以使用 end ^ 運算符的索引從數組末尾獲取元素。 ^0 等于 array.Length,^n 等于 array.Length - n。
Program.cs
string[] names = { "Jane", "Thomas", "Lucy", "David" };Console.WriteLine(names[0]); Console.WriteLine(names[1]); Console.WriteLine(names[2]); Console.WriteLine(names[3]);Console.WriteLine("*************************");Console.WriteLine(names[^1]); Console.WriteLine(names[^2]); Console.WriteLine(names[^3]); Console.WriteLine(names[^4]);在示例中,我們創建了一個字符串名稱數組。我們通過索引訪問每個元素并將它們打印到終端。
string[] names = { "Jane", "Thomas", "Lucy", "David" };
創建了一個字符串數組。
Console.WriteLine(names[0]); Console.WriteLine(names[1]); Console.WriteLine(names[2]); Console.WriteLine(names[3]);數組的每個元素都打印到控制臺。對于 names[0] 結構,我們指的是 names 數組的第一個元素。
Console.WriteLine(names[^1]); Console.WriteLine(names[^2]); Console.WriteLine(names[^3]); Console.WriteLine(names[^4]);我們從末尾訪問數組元素。
$ dotnet run
Jane
Thomas
Lucy
David
*************************
David
Lucy
Thomas
Jane
四、C# 修改數組元素
可以修改數組的元素——它們不是不可變的。
Program.cs
int[] vals = { 1, 2, 3, 4 };vals[0] *= 2; vals[1] *= 2; vals[2] *= 2; vals[3] *= 2;Console.WriteLine("[{0}]", string.Join(", ", vals));我們有一個由三個整數組成的數組。每個值將乘以 2。
int[] vals = { 1, 2, 3, 4 };An array of three integers is created.
vals[0] *= 2; vals[1] *= 2; vals[2] *= 2; vals[3] *= 2;使用元素訪問,我們將數組中的每個值乘以 2。
Console.WriteLine("[{0}]", string.Join(", ", vals));使用 Join 方法,我們從數組的所有元素中創建一個字符串。元素用逗號分隔。
$ dotnet run [2, 4, 6, 8]所有四個整數都乘以數字 2。
五 、C#?數組切片
我們可以使用 .. 運算符來獲取數組切片。范圍指定范圍的開始和結束。范圍的開始是包含的,但范圍的結束是排除的。這意味著開始包含在范圍內,但結束不包含在范圍內。
Program.cs
int[] vals = { 1, 2, 3, 4, 5, 6, 7 };int[] vals2 = vals[1..5]; Console.WriteLine("[{0}]", string.Join(", ", vals2));int[] vals3 = vals[..6]; Console.WriteLine("[{0}]", string.Join(", ", vals3));int[] vals4 = vals[3..]; Console.WriteLine("[{0}]", string.Join(", ", vals4));該示例適用于數組范圍。
int[] vals2 = vals[1..5];我們創建一個數組切片,其中包含從索引 1 到索引 4 的元素。
int[] vals3 = vals[..6];如果省略起始索引,則切片從索引 0 開始。
int[] vals4 = vals[3..];如果省略結束索引,則切片一直到數組的末尾。
$ dotnet run [2, 3, 4, 5] [1, 2, 3, 4, 5, 6] [4, 5, 6, 7]六、C#?遍歷數組
我們經常需要遍歷數組的所有元素。我們展示了遍歷數組的兩種常用方法。
Program.cs
string[] planets = { "Mercury", "Venus", "Mars","Earth", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto" };for (int i=0; i < planets.Length; i++) {Console.WriteLine(planets[i]); }foreach (string planet in planets) {Console.WriteLine(planet); }創建了一個行星名稱數組。我們使用 for 和 foreach 語句來打印所有值。
for (int i=0; i < planets.Length; i++) {Console.WriteLine(planets[i]); }在這個循環中,我們利用了可以從數組對象中獲取元素數量的事實。元素的數量存儲在 Length 屬性中。
foreach (string planet in planets) {Console.WriteLine(planet); }foreach 語句可用于在遍歷數組或其他集合時使代碼更緊湊。在每個循環中,將行星變量傳遞給行星數組中的下一個值。
七、C#? 數組維度
到目前為止,我們已經使用了一維數組。指定元素所需的索引數稱為數組的維度或等級。
7.1 二維數組
接下來,我們使用二維數組。
Program.cs
int[,] twodim = new int[,] { {1, 2, 3}, {1, 2, 3} };int d1 = twodim.GetLength(0); int d2 = twodim.GetLength(1);for (int i=0; i<d1; i++) {for (int j=0; j<d2; j++){Console.WriteLine(twodim[i, j]);} }如果我們需要兩個索引來訪問數組中的元素,那么我們就有一個二維數組。
int[,] twodim = new int[,] { {1, 2, 3}, {1, 2, 3} };我們在一個語句中聲明和初始化一個二維數組。注意方括號內的逗號。
int d1 = twodim.GetLength(0); int d2 = twodim.GetLength(1);我們得到數組的維度。 GetLength 獲取數組指定維度中的元素數。
for (int i=0; i<d1; i++) {for (int j=0; j<d2; j++){Console.WriteLine(twodim[i, j]);} }我們使用兩個 for 循環遍歷二維數組的所有元素。請注意,特定數組元素是使用兩個索引獲得的,由逗號分隔。
$ dotnet run 1 2 3 1 2 3我們可以使用 foreach 循環遍歷二維數組。
Program.cs
int[,] vals = new int[4, 2] {{ 9, 99 },{ 3, 33 },{ 4, 44 },{ 1, 11 } };foreach (var val in vals) {Console.WriteLine(val); }使用 foreach 循環,我們從頭到尾一個接一個地獲取元素。
$ dotnet run 9 99 3 33 4 44 1 117.2 三維數組
接下來,我們使用一個三維數組。
Program.cs
int[,,] n3 = {{{12, 2, 8}},{{14, 5, 2}},{{3, 26, 9}},{{4, 11, 2}} };int d1 = n3.GetLength(0); int d2 = n3.GetLength(1); int d3 = n3.GetLength(2);for (int i=0; i<d1; i++) {for (int j=0; j<d2; j++){for (int k=0; k<d3; k++){Console.Write(n3[i, j, k] + " ");}} }Console.Write('\n');我們有一個數字三維數組。同樣,我們用數字初始化數組并將它們打印到終端。
int[,,] n3 = {{{12, 2, 8}},{{14, 5, 2}},{{3, 26, 9}},{{4, 11, 2}} };左側的方括號和右側的附加大括號之間還有另一個逗號。
for (int k=0; k<d3; k++) {Console.Write(n3[i, j, k] + " "); }這個循環穿過第三個維度。我們使用三個索引從數組中檢索值。
$ dotnet run 12 2 8 14 5 2 3 26 9 4 11 27.3 C#數組的秩
有一個 Rank 屬性給出了數組的維數。
Program.cs
int[] a1 = { 1, 2 }; int[,] a2 = { { 1 }, { 2 } }; int[,,] a3 = { { { 1, 2 }, { 2, 1 } } };Console.WriteLine(a1.Rank); Console.WriteLine(a2.Rank); Console.WriteLine(a3.Rank);我們有三個數組。我們使用 Rank 屬性來獲取每個維度的維數。
Console.WriteLine(a1.Rank);Here we get the rank for the first array.
$ dotnet run 1 2 3八、C# 非等長數列
????????具有相同大小元素的數組稱為矩形數組。相反,具有不同大小元素的數組稱為鋸齒狀數組。鋸齒狀數組的聲明和初始化方式不同。
Program.cs
int[][] jagged = new int[][] {new int[] { 1, 2 },new int[] { 1, 2, 3 },new int[] { 1, 2, 3, 4 } };foreach (int[] array in jagged) {foreach (int e in array){Console.Write(e + " ");} }Console.Write('\n');這是一個鋸齒狀數組的例子。
int[][] jagged = new int[][] {new int[] { 1, 2 },new int[] { 1, 2, 3 },new int[] { 1, 2, 3, 4 } };這是一個鋸齒狀數組的聲明和初始化。請注意,這一次,我們使用了兩對方括號。我們有一個數組數組。更具體地說,我們已經聲明了一個具有三個 int 數據類型的數組。每個數組都有不同數量的元素。
foreach (int[] array in jagged) {foreach (int e in array){Console.Write(e + " ");} }我們使用兩個 foreach 循環來遍歷鋸齒狀數組。在第一個循環中,我們得到了數組。在第二個循環中,我們獲取所獲得數組的元素。
九、C#向量的方法
????????有多種處理數組的方法。這些方法可用于檢索、修改、排序、復制、搜索數據。我們使用的這些方法是 Array 類的靜態方法或數組對象的成員方法。
Program.cs
string[] names = {"Jane", "Frank", "Alice", "Tom" };Array.Sort(names);foreach(string el in names) {Console.Write(el + " "); }Console.Write('\n');Array.Reverse(names);foreach(string el in names) {Console.Write(el + " "); }Console.Write('\n');在此示例中,我們對數據進行排序。
string[] names = {"Jane", "Frank", "Alice", "Tom" };我們有一個字符串數組。
Array.Sort(names);靜態排序方法按字母順序對數據進行排序。
Array.Reverse(names);Reverse 方法反轉整個一維數組中元素的順序。
$ dotnet run Alice Frank Jane Tom Tom Jane Frank Alice我們按升序和降序對名稱進行了排序。
以下示例使用 SeValue、GetValue、IndexOf、Copy 和 Clear 方法。
Program.cs
string[] names = {"Jane", "Frank", "Alice", "Tom"}; string[] girls = new string[5];names.SetValue("Beky", 1); names.SetValue("Erzebeth", 3);Console.WriteLine(names.GetValue(1)); Console.WriteLine(names.GetValue(3));Console.WriteLine(Array.IndexOf(names, "Erzebeth"));Array.Copy(names, girls, names.Length);foreach(string girl in girls) {Console.Write(girl + " "); }Console.Write('\n');Array.Clear(names, 0, 2);foreach(string name in names) {Console.Write(name + " "); }Console.Write('\n');此示例介紹了其他方法。
names.SetValue("Beky", 1); names.SetValue("Erzebeth", 3);SetValue 為數組中的特定索引設置一個值。
Console.WriteLine(names.GetValue(1)); Console.WriteLine(names.GetValue(3));我們使用 GetValue 方法從數組中檢索值。
Console.WriteLine(Array.IndexOf(names, "Erzebeth"));IndexOf 方法返回特定值第一次出現的索引。
Array.Copy(names, girls, names.Length);Copy 方法將值從源數組復制到目標數組。第一個參數是源數組,第二個是目標數組。第三個參數是長度;它指定要復制的元素數量。
Array.Clear(names, 0, 2);Clear 方法從數組中刪除所有元素。它需要三個參數:數組、起始索引和從索引中清除的元素數。
$ dotnet run Beky Erzebeth 3 Jane Beky Alice ErzebethAlice Erzebeth總結
- 上一篇: C#教程6:流控制语句
- 下一篇: c# char unsigned_dll