C#高级编程(第9版) 第06章 数组
生活随笔
收集整理的這篇文章主要介紹了
C#高级编程(第9版) 第06章 数组
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
好久沒發東西了 , 一停下來就會變懶。。。。 雖然沒完成,也就是它吧
--------------------------------- 以下正文 --------------------------------
本章要點
1 簡單數組
2 多維數組
3 鋸齒數組
4 Array類
5 作為參數的數組
6 枚舉
7 元組
8 結構比較
同一類型和不同類型的多個對象
如果需要使用同一類型的多個對象,就可以使用集合(參見第10章)和數組。
C#用特殊的記號聲明、初始化、使用數組。
Array類在后臺發揮作用,它為數組中元素的排序和過濾提供了幾個方法。
使用枚舉器,可以迭代數組中的所有元素。
如果需要使用不同類型的對象,可以使用Tuple(元組)類型。
簡單數組
數組的聲明
首先定義數組中元素的類型,其后是一對空方括號和一個變量名。
數組的初始化
數組是引用類型,所以必須給它分配堆上的內存。
為此,應使用new運算符,指定數組中元素的類型和數量來初始化數組的變量。
[*值類型和引用類型請參見第3章]
聲明和初始化數組后,變量就引用了n個相應類型的對象,它們位于托管堆上。
在指定了數組的大小后,如果不復制數組中的所有元素,就不能重新設置數組的大小;
如果事先不知道數組中應包含多少個元素,就可以使用集合。
還可以使用數組初始化器為數組的每個元素賦值。
int[] myArray = new int[4] {1, 2, 3, 4};
數組初始化器只能在聲明數組變量時使用,不能在聲明數組之后使用。
訪問數組元素
使用索引器訪問其中的元素,數組只支持有整形參數的索引器。
使用引用類型
必須注意:如果數組中的元素是引用類型,就必須為每個數組元素分配內存。否則會拋出異常NullReferenceException。
多維數組
一般數組(也稱為一維數組)用一個整數來索引;多維數組用兩個或更多個整數來索引。
在C#中聲明這個二維數組,需要在方括號中加上一個逗號,在初始化時應指定每一維的大小(也稱為階)。
int[ , ] twodim = new int[3, 3]; //數組聲明之后,就不能修改其階數了。
鋸齒數組
在鋸齒數組中,每一行都可以有不同的大小。
Array類
用方括號聲明數組是C#中使用Array類的表示法。在后臺使用C#語法,會創建一個派生自抽象基類Array的新類。
創建數組
Array是一個抽象類,所以不能使用構造函數來創建數組。
除了使用C#語法創建數組實例之外,還可以使用靜態方法CreateInstance()創建數組。如果事先不知道元素的類型,該靜態方法就非常有用,因為類型可以作為Type對象傳遞給CreateInstance()方法。
Arrray intArray = Array.CreateInstance(typeof(int), 5);
for (int i=0; i<5; i++) {
intArray.SetValue(33, 1); //設置對應元素的值
}
還可以將已創建的數組強制轉換成聲明為int[]的數組;
int[] intArrayCopy = (int[]) intArray;
復制數組(克隆數組)
int[] intArrayClone = (int[]) intArray.Clone();
排序
Array類使用QuickSort算法對數組中的元素進行排序。
Sort()方法需要數組中的元素實現IComparable接口。 因為簡單類型(如System.String 和 System.Int32)實現IComparable接口,所以可以對包含這些類型的元素排序。
eg:
string[] names ={
"Christina Aguilera",
"Shakira",
"Beyonce",
"Lady Gaga"
};
Array.Sort(names);
foreach (var name in names) {
Console.WriteLine(name);
}
如果對數組使用自定義類,就必須實現IComparable接口或IComparer<T>接口。
這兩個接口只定義了一個方法CompareTo(),如果要比較的對象相等,該方法就返回0;如果該實例應該排在參數對象的前面,該方法就返回小于0的值,如果排在后面,反之。
eg:
public class Person : IComparable<Person> {
public int CompareTo(Person other) {
if (other == null) return 1;
int result = string.Compare(this.LastName, other.LastName);
if (result == 0) {
result = string.Compare(this.FirstName, other.FirstName);
}
return result;
}
}
Array類還提供了Sort方法,它需要講一個委托作為參數。這個參數傳遞給方法,從而比較兩個對象,而不需要依賴IComparable或IComparer接口。
數組作為參數
數組協變
數組支持協變。 這表示數組可以聲明為基類,其派生類型的元素可以賦予數組元素。
數組協變只能用于引用類型,不能用于值類型。另外,數組協變有一個問題,它只能通過運行時異常來解決。
ArraySegment<T>
該結構表示數組的一段。如果需要使用不同的方法處理某個大型數組的不同部分,那么可以把相應的數組部分復制到各個方法中。此時,與創建多個數組下你個比,更有效的方法是使用一個數組,將整個數組傳遞給不同的方法。這些方法只使用數組的某個部分。方法的參數除了數組以外,還應該包括數組內的偏移量以及該方法應該使用的元素數。這樣一來,方法就需要至少3個參數。當時用數組段時,只需要一個參數就可以了。
枚舉
在 foreach 語句中使用枚舉,可以迭代集合中的元素,且無須知道集合中的元素個數。
foreach 語句使用了一個枚舉器。
數組或結合實現了 帶GetEumerator()方法的 IEumerable 接口。GetEumerator()方法返回一個實現 IEumerable 接口的枚舉。接著, foreach 語句就可以使用 IEumerable 接口迭代集合了。
IEnumerator接口
foreach 語句使用IEnumerator接口的方法和屬性,迭代集合中的所有元素。
為此,IEnumerator定義了Current屬性,來返回光標所在的元素,該接口的MoveNext()方法移動到集合的下一個元素上,如果有這個元素,該方法就返回true。如果集合不在有更多的元素,該方法就返回false。
foreach語句
C#的foreach語句不會解析為IL代碼中的foreach語句。C#編譯器會把foreach語句轉換為IEnumerable接口的方法和屬性。
eg:
foreach (var p in persons) {
Console.WriteLine(p);
}
foreach 語句的解析過程: 首先,調用GetEnumerator()方法,獲得數組的一個枚舉器。在while循環中 ---------- 只要MoveNext()返回true ---------- 就用Current屬性訪問數組中的元素;
IEnumerator<Person> enumerator = persons.GetEnumerator();
while ( enumerator.MoveNext() ) {
Person p = enumerator.Current;
Console.WriteLine(p);
}
yield語句
在C# 1.0中,創建枚舉器仍需要做大量的工作。C# 2.0添加了yield語句,以便于創建枚舉器。yield return語句返回集合的一個元素,并移動到下一個元素上。yield break 可以停止迭代。
eg:
using System;
using System,Collections;
namespace Wrox.ProCSharp.Arrays {
public class HelloCollection {
public IEnumerator<string> GetEnumerator() {
yield return "Hello";
yield return "World";
}
}
}
包含yield語句的方法或屬性也稱為迭代塊。迭代塊必須聲明為返回IEnumerator或IEnumerable接口,或者這些接口的泛型版本。這個塊可以包含多條 yield return 語句或 yield break 語句,但不能包含return語句。
現在可以用foreach語句迭代集合了:
public void HelloWorld() {
var helloCollection = new HelloCollection();
foreach (var s in helloCollection) {
Console.WriteLine(s);
}
}
yeild語句會生成一個枚舉器,而不僅僅生成一個包含的項的列表,這個枚舉器通過foreach語句調用。從foreach中依次訪問每一項時,就會訪問枚舉器。這樣就可以迭代大量的數據,而無須一次把所有的數據都讀入內存。
【未完懶得寫了。。。。。 有時間再來填坑吧】
總結
以上是生活随笔為你收集整理的C#高级编程(第9版) 第06章 数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux命令应用大词典-第41章 My
- 下一篇: 丑憨批的NLP笔记BERT前置:ATUO