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接口。
这两个接口只定义了一个方法compareto(),如果要比较的对象相等,该方法就返回0;如果该实例应该排在参数对象的前面,该方法就返回小于0的值,如果排在后面,反之。
eg:
public class person : icomparable {
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
该结构表示数组的一段。如果需要使用不同的方法处理某个大型数组的不同部分,那么可以把相应的数组部分复制到各个方法中。此时,与创建多个数组下你个比,更有效的方法是使用一个数组,将整个数组传递给不同的方法。这些方法只使用数组的某个部分。方法的参数除了数组以外,还应该包括数组内的偏移量以及该方法应该使用的元素数。这样一来,方法就需要至少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 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 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章 数组的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇:
- 下一篇: