数组

简单数组

如果需要使用同一个类型的多个对象,就可以使用数组。数组是一种数据结构,它可以包含同一类型的多个元素。

数组声明:int[] myArray

使用new运算符,指定数组中元素的类型和数量来初始化数组的变量。指定数组的大小:

myArray=new int[4]

声明和初始化数组后,变量myArray就引用了4个整形值,它们位于托管堆上:

在一个语句中声明和初始化数组

int[] myArray=new int[4];

使用数组初始化器为数组的每个元素赋值。

int[] myArray=new int[4]{4,7,11,2};

访问数组元素

数组只支持有整型参数的索引器。索引器总是以0开始,表示第一个元素,可以传递给索引器的最大值是元素个数减1,因为索引从0开始。数组myArray用4个整型值声明和初始化。用索引器对应的值0,1,2,3就可以访问数组中的元素。

在for语句中使用Length属性,在不知道数组中的元素个数的情况下:

使用引用类型

除了能声明预定义类型的数组,还可以声明自定义类型的数组。用Person类来说明,这个类有自动实现的属性Firstname和Lastname.以及Object类重写的ToString()方法;

使用从0开始的索引器,可以为数组的每个元素分配内存:

下图显示了Person数组中的对象在托管堆中的情况。mypersons是储存在栈上的一个变量,该变量引用了储存在托管堆上的Pweson元素对应的数组。

多维数组

一般数组(也称为一维数组)用一个整数来索引,多维数组用两个或多个整数来索引。

二维数组的科学表示法:

声明数组之后,就不能修改其阶数了。

如果事先知道元素的值,则也可以使用数组索引器来初始化二维数组。

使用数组初始化时,必须初始化数组的每个元素,不能遗漏任何元素。

锯齿数组

二维数组

锯齿数组

在声明锯齿数组时,要依次放置左右括号。只在第一对括号中放置该数组包含的行数,定义各行中元素个数的第二个括号设置为空,因为这类数组的每一行包含不同的元素个数,之后,为每一个指定行中的元素个数:

迭代锯齿数组中所有元素的代码可以放在嵌套的for循环中。在外层的for循环中迭代每一行,在内层的for循环中迭代一行中的每个元素:

Array类

创建数组

Array类是一个抽象类,所以不能使用构造函数来创建数组。但除了可以使用c#语法创建数组实例之外,还可以使用静态方法CreateInstance()创建数组。

例子说明了如何创建类型int,大小为5的数组。

复制数组

因为数组是引用类型,所以将一个数组变量赋予另一个数组变量,就会得到两个引用同一数组的变量。而复制数组,会使数组实现IConeable。

如果数组包含引用类型,则不复制元素,而只复制引用。

显示变量beatles和beatlesClone,其中beatlesClone通过从beatles中调用Clone()方法创建。

Clone()方法和Copy()方法的区别:Clone()方法会创建一个新数组,而Copy()方法必须传递阶数相同且有足够元素的已有数组。

排序

Array类使用QuickSory算法对数组中元素的进行排序。

示例程序中,数组name包含string类型的元素,这个数组可以排序》

}

如果对数组使用自定义类。就必须实现IComparabe接口。此接口只定义了一个方法CompareTo(),如果要比较的对象相等,该方法就返回0.如果该实例应排在参数对象的前面,该方法就返回小于0的值,相反,就大于0的值。

LastName的值相同,就比较FirstName。

就可以按姓氏对Person对象对应的数组排列:

假如Person对象排序不同,就可以实现IComparer接口或IComparer<T>接口,定义Compare().IComparer接口独立于比较的类。

类PersonComparer实现了IComparer<Person>接口,按照firstName或lastName对Person对象排序。实现Compare()方法时用了一个switch语句指定是按FirstName还是LastName排序。

按名字对person数组排序:

数组作为参数

数组可以作为参数传递给方法。要返回数组,要将数组声明为返回类型。

GetPerson()所示:

数组协变

数组可以声明为基类,派生元素可以赋予数组元素。

声明object[]类型的参数,给它传递一个Perxon[]:

数组协变只能用于引用类型,不能用于值类型。

ArraySegment<T>表示数组的一段。如果某个方法只返回数组的一部份或给某方法传递数组的一部分,就可以用。

SumOfSegments<T>方法提取一组,ArraySegment<int>元素,计算数组定义的所有整数之和,并返回整数和:

使用这个方法时,传递一个数组段。第一个数组元素从ar1的第一个元素开始,引用了3个元素,第二个数组从ar2的第四个元素开始,引用3个元素:

枚举

在foreach语句中用枚举,可以迭代集合的元素,且无需知道集合中的元素个数。

下图显示了调用foreach方法的客户端和集合之间的关系。

foreach语句

首先foreach语句不会解析IL代码中的foreach语句。编译器会将它转换为IEnumerable借口的方法和属性。

foreach (var p in person)

{

Console.WriteLine(p);

}

它迭代persons数组中的所有元素,并逐个显示。

foreach解析的代码段。

调用GetEnumerator()方法,获取数组枚举器。在While循环中——只要MoveNext()返回ture---就用Current属性访问数组中的元素。

yleld语句

用yiled retum语句实现一个简单集合的代码。

包含yield语句的方法或属性也称为迭代块。

用foreach语句迭代集合;

使用迭代块,编译器会生成一个yield类型,其中包含一个状态机。

yield类型实现IEnumerator和IDisposable接口的属性和方法。可以吧yield类型看做内部类Enumerator.  yield语句会生成一个枚举器,而不仅仅生成一个包含的项的列表。

迭代集合的不同方式

在下面的这个比hello Word示例略大但比较真实的示例中,可以使用yield return语句,以不同方式迭代集合的类。

类MUSICTitles可以用默认方式通过GetEnumerator()方法迭代标题,用Reverse()方法逆序迭代标题,用stubset()方法迭代子集。

默认使用的方法,迭代字符串数组的客户端代码先使用GetEnumerator()方法。

用yield retum返回枚举器

从yield return中返回枚举器。

在Tic Tac Top游戏中有9个域,玩家轮流在这些域中放置一个十字或一个圆。

使用Game Moves类。 第一次调用enumerator.MoveNext()时。会调用Cross()方法。

元组

数组合并了相同类型的对象,而元组合并了不同的对象。

新建的元组用result和reminder变量初始化,返回这两个变量相除的结果:

下面代码说明了divide()方法的调用:

结构比较

IstructuralEquatable接口用于比较两个元素或数组是否有相同的内容,IstructuralComparable接口用于给元素或数组排序。

说明IstructuralEquatable接口的实例,使用实现IEquatable接口的Person类。

创建两个包含person项的数组。他们通过变量名Janet包含相同的person对象,和两个内容相同的不同person对象。

对于IstructuralEquatable接口定义的Equals()方法,第一个参数是object,第二个参数是IEqualityComparer类型。

person实现IEquatable<Person>,比较的对象的内容,数组确保含相同的内容:

如何执行相同的操作:

Tuple<>提供了两个Equlas()方法:一个重写了object基类中的Equals()方法,并把object作为参数,第二个由IStructuralEqualityComparer接口定义,并把object和IEqualityComparer作为参数。

给第一个方法传送另一个元组。

使用类TupleComparer创建一个自定义的IEqualityComparer.

一步一步学c#(六):数组的更多相关文章

  1. 一步一步学Vue(六)https://www.cnblogs.com/Johnzhang/p/7242640.html

    一步一步学Vue(六):https://www.cnblogs.com/Johnzhang/p/7237065.html  路由 一步一步学Vue(七):https://www.cnblogs.com ...

  2. 一步一步学android控件(之十六)—— CheckBox

    根据使用场景不同,有时候使用系统默认的CheckBox样式就可以了,但是有时候就需要自定义CheckBox的样式.今天主要学习如何自定义CheckBox样式.在CheckBox状态改变时有时需要做一些 ...

  3. 一步一步学Vue(六)

    本篇继续介绍vue-router,我们需要要完成这样个demo:<分页显示文章列表>:这里我们以博客园首页列表为例简化处理: 按照上图框选所示,简单分为蓝色部分文章组件(ArticleIt ...

  4. 一步一步学ROP之linux_x64篇

    一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防 ...

  5. 一步一步学ROP之linux_x86篇

    一步一步学ROP之linux_x86篇 作者:蒸米@阿里聚安全 ​ 一.序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过 ...

  6. (转载)一步一步学Linq to sql系列文章

    现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContex ...

  7. 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计

    本帖最后由 xinxincaijq 于 2013-1-9 10:27 编辑 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计 转自博客:http:// ...

  8. 一步一步学Python(2) 连接多台主机执行脚本

    最近在客户现场,每日都需要巡检大量主机系统的备库信息.如果一台台执行,时间浪费的就太冤枉了. 参考同事之前写的一个python脚本,配合各主机上写好的shell检查脚本,实现一次操作得到所有巡检结果. ...

  9. 【DG】[三思笔记]一步一步学DataGuard

    [DG][三思笔记]一步一步学DataGuard 它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)..... ...

  10. 一步一步学Silverlight 2系列(6):键盘事件处理

    一步一步学Silverlight 2系列(6):键盘事件处理   概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言V ...

随机推荐

  1. mini-httpd源码分析-mini-httpd.c之外总结

    version.h #define SERVER_SOFTWARE "mini_httpd/1.21 18oct2014" #define SERVER_URL "htt ...

  2. Couldn't read row 0, col -1 from CursorWindow

    java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Curso ...

  3. [转]iOS UIAppearance使用详解

    在iOS 5以前,自定义原生控件的外观并没有原生支持,因此开发人员感觉很麻烦.开发人员经常面临的问题是修改一个控件所有实例的外观.解决这个问题的正确方法是重写一遍控件.但由于这么做非常费时,一些开发人 ...

  4. (转)设置 UILabel 和 UITextField 的 Padding 或 Insets (理解UIEdgeInsets)

    转自http://unmi.cc/uilable-uitextfield-padding-insets 主要是理解下UIEdgeInsets在IOS UI里的意义.靠,这货其实就是间隔,起个名字这么让 ...

  5. ENVISAT卫星及ASAR数据介绍

    摘要: ENVISAT卫星是欧空局的对地观测卫星系列之一,于2002年3月1日发射升空.该卫星是欧洲迄今建造的最大的环境卫星.星上载有10种探测设备,其中4种是ER S-1/2所载设备的改进型,所载最 ...

  6. 低功耗之战!ANT VS Bluetooth LE

    利用近距离无线通信技术将手机及可穿戴式传感器终端等与智能电话连接起来,实现新的功能.最近,以此为目标的行动正在展开.其中备受关注的近距离无线方式是“ANT”和“Bluetooth LE”.为了在各种便 ...

  7. outlook 2007如何设置自动转发功能

    "工具" => "规则和通知" => 新建规则 => "邮件到达时检查" => 设置你的条件,比如发件人是谁,主题是 ...

  8. 编程珠玑I算法总结

    主要是根据编程珠玑后面的Algorithm附录总结了一下这本书里面的经典算法. 1 辗转相减求最大公约数 思想:最大公约数能整除i和j,则其一定也能整除i-j(if i>j) int gcd(i ...

  9. discuz函数dgmdate

    function dgmdate($timestamp, $format = 'dt', $timeoffset = '9999', $uformat = '') { global $_G; $for ...

  10. 项目代码摘抄,dot的用法之1

    function searchTags() { var list = $('#tags-list-select option:selected').val(); console.log(list); ...