好久没发东西了 , 一停下来就会变懒。。。。 虽然没完成,也就是它吧
--------------------------------- 以下正文 --------------------------------
本章要点
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章 数组的更多相关文章

  1. 【转】apue《UNIX环境高级编程第三版》第一章答案详解

    原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此 ...

  2. C#高级编程 (第六版) 学习 第一章:.Net体系结构

    第一章 .Net体系结构 1,公共语言运行库(Common Language Runtime, CLR) .Net Framework的核心是其运行库的执行环境,称为公共语言运行库,或.Net运行库. ...

  3. C#高级编程第11版 - 第六章 索引

    [1]6.2 运算符 1.&符在C#里是逻辑与运算.管道符号|在C#里则是逻辑或运算.%运算符用来返回除法运算的余数,因此当x=7时,x%5的值将是2. [2]6.2.1 运算符的简写 1.下 ...

  4. C#高级编程第11版 - 第五章 索引

    [1]5.1 泛型概述 1.通过泛型,你可以创建独立于特定类型(contained types)以外的方法和类,而不用为不同类型编写多份同样功能的代码,你只需要创建一个方法或者类. 2.泛型类使用泛型 ...

  5. C#高级编程第11版 - 第三章 索引

    [1]3.1 创建及使用类 1.构造函数:构造函数的名字与类名相同: 使用 new 表达式创建类的对象或者结构(例如int)时,会调用其构造函数.并且通常初始化新对象的数据成员. 除非类是静态的,否则 ...

  6. C#高级编程 (第六版) 学习 第二章:C#基础

    第二章 基础 1,helloworld示例: helloworld.cs using System; using System.Collections.Generic; using System.Li ...

  7. C#高级编程第11版 - 第七章 索引

    [1]7.1 相同类型的多个对象 1.假如你需要处理同一类型的多个对象,你可以使用集合或者数组. 2.如果你想使用不同类型的不同对象,你最好将它们组合成class.struct或者元组. [2]7.2 ...

  8. C#高级编程第11版 - 第四章 索引

    [1]4.2 继承的类型 1.C#不支持类的多继承,但它支持一个接口继承自多个接口. 2.单继承:单继承允许一个类继承自另外一个基类,C#支持. 3.多级继承:多级继承允许创建一个类继承自它的父类,而 ...

  9. ASP.NET MVC 4高级编程(第4版)

    <ASP.NET MVC 4高级编程(第4版)> 基本信息 作者: (美)Jon Galloway    Phil Haack    Brad Wilson    K. Scott All ...

  10. 《UNIX环境高级编程(第3版)》

    <UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...

随机推荐

  1. JavaBean是什么

    作者:杨博链接:https://www.zhihu.com/question/19773379/answer/31625054来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  2. 读《Adaptive Thresholding Using the Integral Image》自适应图像阈值

    图像的二值化问题总是一个问题.虽然使用深度学习的方法取得了不小的进展,但是传统的方法还是值得借鉴. 刚好随机游走到这篇文章 挖个07年的坟  地址:http://people.scs.carleton ...

  3. springCloud 之 Eureka注册中心高可用配置

    springCloud的eureka高可用配置方案思路是:几个服务中心之间相互注册,比如两个注册中心,A注册到B上,B注册到A上,如果是三个注册中心则是:A注册到BC上,B注册到AC上,C注册到AB上 ...

  4. Rabbitmq与spring整合之重要组件介绍——AMQP声明式配置&RabbitTemplate组件

    上一节是使用rabbitAdmin的管理组件进行声明队列,交换器,绑定等操作,本节则是采用AMQP声明式配置来声明这些东西.AMQP声明主要是通过@Bean注解进行的. 配置: package com ...

  5. JS - 判断字符串某个下标的值

    <html><body> <script type="text/javascript"> var str="0123456789!&q ...

  6. Day7 - A - Visible Lattice Points POJ - 3090

    A lattice point (x, y) in the first quadrant (x and y are integers greater than or equal to 0), othe ...

  7. 初学Java(1)

    1.Java基本数据类型: 2.Java的main方法: 被static修饰,类名与文件名相同:void:方法的返回值,无返回值:main方法是程序的入口,有且只有一个: String[] args: ...

  8. windowsXP下 使用live555搭建视频服务器,并使用ffplay和VLC播放

    首先在官网下载live555:http://www.live555.com/mediaServer/#downloading当然是现在windows的版本了!!上官网下载FFmpeg:http://f ...

  9. jsp与spring mvc后台controller间参数传递处理之总结

    在编程过程中,最容易出现问题及卡壳的地方,往往是各层之间接缝处,接缝处往往存在着各种各样的参数传递,数据转换和格式化,参数很好的传递并正确接收过来之后就是复杂逻辑之间的处理了,所以为了避免多种问题占用 ...

  10. Elasticsearch全文搜索引擎-PHP使用教程。

    1.声明依赖关系:         比方说,你的项目中需要一个php版的elasticsearch框架.为了将它添加到你的项目中(下载),你所需要做的就是创建一个 composer.json 文件,其 ...