綜述:
C#中的集合一般指C#中的集合類,一般用於處理對象列表,功能大多是通過實現System.Collections命名空間中的接口而獲得的。數組是System.Array類的實例,只是集合類的一種。
System.Collection命名空間中的下述幾個接口提供了基本的集合功能:
1.IEnumerable可迭代集合中的項
2.ICollection(繼承於IEnumerable)可以獲取集合中項的個數,並能把項複製到一個簡單的數組類型中
3.IList(繼承於IEnumerable和ICollection)提供了集合的項列表,允許訪問這些項,並提供其他一些與這些項列表相關的基本功能
4.IDictionary(繼承於IEnumerable和Icollection)類似於IList,但提供了可通過鍵值(而非索引)訪問的項列表
一.簡單集合-----數組
1.聲明數組
<baseType>[] <name>;
2.數組必須在訪問前初始化,初始化的方式有如下兩種:
1).使用字面值指定數組,提供一個用逗號分開的元素值列表,如:
int[] myArray={1,2,3,4};
2).使用關鍵字new初始化,用一個常量定義數組大小,默認值爲0
int[] myArray=new int[arraySize const];
或者
int[] myArray;
myArray=new int[arraySize const];
3.foreach語句可以只讀訪問數組中的每一個元素,使用方法爲:
foreach(<baseType> <varName> in<arrayName>)
{
Console.WriteLine(varName);
}
4.多維數組
相比於單維數組用一個索引訪問元素,多爲數組是用多個索引訪問其元素
1>.聲明多維數組:
<baseType>[ , , ,] <name>;
2>.初始化多維數組:
eg:
用new關鍵字: double[,] hillHeigh=new double[3,4];
用字面值:double [,,] Point={{1,2,3},{1,3,4},{1,3,5}};
5.數組的數組
二.高級集合 ------- ArrayList
System.Collection.ArrayList類的對象ArrayList可以處理大小可變的項列表。詳細可見下表(區別語Array數組)
|
簡單數組 |
ArrayList |
類名 |
System.Array |
System.Collection.ArrayList |
特點 |
引用類型,需要初始化大小,並逐項賦值 |
大小可變,無需初始化大小 |
定義 |
Animal [] animalArray=new Animal[2] |
ArrayList animalArrayList=new ArrayList(); |
賦值 |
animalArray[0]=new Chicken("ken"); |
animalArrayList.Add(new Chicken("Roy")); |
統計大小 |
animalArray.Length() |
animalArrayList.Count; |
數據類型 |
數組的類型是Animal,可以直接使用 |
無數據類型,需強制轉換成Animal |
ArrayList的其他方法有:
1). Remove(myCow2):刪除myCow2對象
2).RemoveAt(0):刪除第一個對象
3).AddRange(animalArray):把數組animalArray中的對象添加到集合中
4).IndexOf(myCow2):myCow2的索引值
三.自定義強類型化集合
自定義強類型集合最快捷的方式是定義一個繼承自CollectionBase的類。但自定義集合不能用索引值來訪問集合中的項
四.索引符
索引符是一種特殊的屬性,可以將之添加到類中,以便提供類似於數組的訪問。
1.添加方法
類的定義中用 this關鍵字+ [ ]。
2.索引器與數組的比較:用戶
1).索引器中的索引值不受限爲整數,並且可以是多參數
2).索引器允許重載,只要索引器的參數和返回值類型不同即可。
3).索引器不是一個變量,不指向數據存放的位置,而數組指向數據存放地址。索引器中讀寫數據時用get和set訪問器
3.索引器被稱爲有參屬性,但它與屬性之間的區別是:
1).屬性以屬性名標示,索引器用函數方式標示(訪問權限級別+返回值+this+參數)
2).索引器可以被重載
3).索引器永遠屬於實例成員,不能聲明爲static,而屬性可以。
五.關鍵字值集合和Idictionary
集合類中可以通過實現接口IDictionary實現關鍵字值作爲索引參數而非索引值。區別於IList接口。爲簡化IDictionary接口的實現,可以通過繼承DictionaryBase類。類似於Ilist繼承CollectioinBase類。
IList接口和IDictionary接口區別如下
1.IDictionary可以實現clear()和count方法,不能實現RemoveAt()方法。但可實現Remove()方法
2. Add()方法有兩個object類型的參數,一個存放關鍵字一個存放值
3.Remove()方法的參數是關鍵字值,即帶有該值的項將會被刪除
4.Indexer使用一個字符串鍵值,而非一個索引用戶Dictonary的繼承成員來訪問存儲的項,這裏任需進行數據類型轉換
5.foreach的工作方式:IDictonary接口中提供DictonaryEntry結構實現項目的訪問,用該結構的Value成員訪問集合中的對象
六.迭代器
迭代器是一個能夠實現依次返回每個元素的功能的代碼塊,類似於foreach功能重寫定製。凡是函數簽名符合迭代器規則的方法、屬性訪問器和其他代碼塊都可以作爲迭代器。簽名規則如下:
1.返回值有限制:返回值必須是IEnumerator、Ienumerable、Ieumerator<T>和Ienumerable<T>
1).如果要迭代一個類,可以使用GetEnumerator()方法,其返回類型是Ienumerator.
2).如果要迭代一個類成員,則返回值是Ienumerable
2.使用yield return返回需要的值