第五章 数组
1,简单数组
声明:int[] myArray;
初始化:myArray = new int[4]; 为数组分配内存。
还可以用如下的方法:
int[] myArray = new int[4]{1,2,3,4}; int[] myArray = new int[]{1,2,3,4}; int[] myArray = {1,2,3,4}; |
如果数组中的元素是引用类型,必须为每个数组分配内存:
public class Person { public string FirstName { get; set; } public string LastName { get; set; } public Person() { } public Person(string firstName, string lastName) { this.FirstName = firstName; this.LastName = lastName; } public override string ToString() { return String.Format("First name:{0}\nLast name:{1}", FirstName, LastName); } } |
Person[] myPersons = new Person[2]; myPersons[0] = new Person{"Ayrton","Senna"}; myPersons[1] = new Person{"Michael", "Schumacher"}; |
也可以
Person[] myPersons = {new Person("A","B")}; |
如果不用new,会报错。
2,多维数组
声明和使用多维数组:
int [,] twoDim = new int[3,3]; twoDim[0,0] = 1; twoDim[2,,2] = 10; |
数组声明之后,就不能改变其维数了。
3,锯齿数组
每一行都有不同的大小
int[][] jagged = new int[3][]; jagged[0] = new int[2]{1,2}; jagged[1] = new int[6]{1,2,3,4,5,6}; jagged[2] = new int[3]{1,2,3}; |
4, Array类
创建数组
Array myArray = Array.CreateInstance(typeof(int), 5); |
复制数组
实现了IClonable接口
Array.Clone():创建数组的浅表副本
Array.CopyTo:传送已有副本
排序:实现了IComparable接口
5,数组和集合接口
Array类实现了IEnumable、ICollection和IList接口
ICollection接口派生于IEnumable接口,添加了如下属性和方法
属性和方法 |
说明 |
Count |
集合中元素的个数,和Length相同 |
IsSynchronized SyncRoot |
IsSynchronized确定集合是否线程安全的。数组是false,对于同步访问,SyncRoot可以用于线程安全的访问 |
CopyTo |
将数组的元素复制到已有数组中,类似于静态的Array.CopyTo |
IList
IList接口派生于ICollection接口,
接口函数和属性 |
说明 |
Add() |
向集合中添加元素 |
Clear() |
清除数组中所有的元素 |
Contains() |
确定某个元素是否在数组中,返回为true或者false。 |
Indexof() |
对数组元素进行线性搜索,返回找到的第一个元素的索引。为找到返回-1. |
Insert() Remove() RemoveAll() |
对集合,插入,删除,删除全部。 对数组,不支持,抛异常。 |
IsFixedSize |
数组大小是固定的,返回true |
IsReadOnly |
是否可以读写 |
Item |
使用整型索引访问数组 |
6,枚举
IEnumerator接口
接口的方法和属性 |
说明 |
MoveNext() |
移动到集合的下一个元素上,有,true,结尾,false |
Currnet() |
返回光标所在的元素 |
Reset() |
将光标重新定位到开头 |
foreach语句解析
数组或者集合执行带GetEumerator()方法的IEnumerable接口。GetEnumerator返回一个执行IEnumerable接口的枚举。然后使用枚举迭代集合。
foreach(Person p in persons) { Console.WriteLine(p); } |
IEnumerator enumerator = persons.GetEnumerator(); while(enumerator.MoveNext()) { Person p = (Person)enumerator.Current; Console.WriteLine(p); } |
yield语句
C#2.0添加了yield语句,用于创建枚举器。
public class HelloCollection { public IEnumerator<string> GetEnumerator() { yield return "Hello"; yield return "World"; } } |
HelloCollection h = new HelloCollection(); foreach (string s in h) { Console.WriteLine(s); } |