8.集合,索引器和迭代器
2016-06-05 22:04
423 查看
综述:
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:<
4000
/p>
用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的其他方法有:
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接口
bd9f
区别如下
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返回需要的值
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:<
4000
/p>
用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 |
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接口
bd9f
区别如下
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返回需要的值