数组
1.简单数组
2.多维数组
3.锯齿数组
4.Array类
5.作为参数的数组
6.枚举
7.元组
8.结构比较
如果需 要 使 用同 一 类型的 多 个对 象,就可以 使 用集合和数组。C#用特殊的 记号声明 、
初始 化 和使用数组。 Array类 在后台 发挥作用,它为 数组中 元素的 排 序和过滤提供了几个方法。 使 用枚举器,可 以 迭 代数组中 的 所 有元素。.net4还引 入了 一个新类型 Tuple,它 用于合并不同 类型的 多 个对象。
一、简单数组
如果需要使用同一类型的多个对象,就可以使用数组。数组是一种数据结构,它可以包含同一类型的多个元素。
1.数组的声明:在声明数组时,应先定义数组中元素的类型,其后是一对方括号和一个变量名。
2.数组的初始化:声明了数组后,就必须为数组分配内存,以保存数组的所有元素。数组是引用类型,所以必须给它分配堆上的内存。为此,应使用new运算符,指定数组中元素的类型和数量来初始化数组的变量。还可以用数组初始化器为数组的每个元素赋值。数组初始化器只能在声明数组变量时使用,不能在声明数组之后使用。如果用花括号初始化数组,则还可以不指定数组的大小,因为编译器会自动统计元素的个数。
3.访问数组元素:可以使用索引器访问数组中的元素,一对方括号中间加整数如[0]。数组只支持有整型参数的索引器。通过索引器传递元素编号,就可以访问数组。索引器总是以0开头,表示第一个元素。可以传递给索引器的最大值是元素个数减1.还可以用for、foreach还循环迭代数组中的元素。
4.使用引用类型:声明自定义类型的数组,声明,定义及初始化
二、多维数组:
多维数组用两个或多个整数来索引
声明多维数组时,维与维之间用【,】分隔,初始化时应指定每一维的大小。之后就可以用两个或多个整数作为索引器来访问数组中的元素。声明数组后就不能更改其阶数或维数。使用数组初始化器初始化时,必须初始化数组的每个元素,不能遗漏任何元素。
三、锯齿数组
锯齿数组的大小设置比较灵活,每一行都可以有不同的大小,不同于普通二维数组对应一个矩形。
在声明 锯齿数组时,要依次放置左右括号。 在初始化锯齿数组时,只 在第 1对 方括号中设置该数组包含的 行数。定义各行中 元素个数的 第 2个方括号设置为空,因 为这类数组的 每一行包含不同的 元素个数。 之后,为每一行指定行中的 元素个数。
迭代访问锯齿数组中所有元素的代码可以放在嵌套的for循环中。在外层的for循环中迭代一行中的每个元素。
四、Array类:
用方 括号声明 数组是C#中 使 用 Array类 的 表示法。 在 后台 使 用C# ,会创建一个派生自 抽象基类Array的新类。这样就可以使用Array类为每个C#数组定义的方法和属性了。Array类 实现的 其 他 属性有LongLength和 Rank。 如果数组包含的 元 素个 数超出了 整数的 取值 范围,就可以 使 用LongLength属性来获得元素个数。 使 用 Rank属 性可以 获得数组的 维数。
其他成员:
1.创建数组:Array类是一个抽象类,所以不能使用构造函数来创建数组。但除了可以使用C#语法创建数组实例之外,还可以使用静态方法CreateInstance()创建数组。如果事件不知道元素的类型,该静态方法就非常有用,因为类型可以作为Type对象传递给CreateInstance()方法。第一个参数应是元素的类型,常见typeof(int),第二个参数定义数组的大小。可以用SetValue()方法设置对应元素的值,用GetValue()方法读取对应元素的值。还可以 将已 创建的 数组强制转换成声明 为 int[]的 数组。CreateInstance()方法有很多重载版本,可以创建多维数组和不基于0的数组。
2.复制数组:复制数组,会使 数 组 实 现ICloneable接 口 。 这个接口定义的Clone()方法会创 建数组的浅表副本。如果数组包 含引 用 类型,则 不复制 元 素,而只复制引 用。除了 使 用 Clone()方 法之外,还可以 使 用Copy()方 法 创建 浅表副本。 但Clone()方法和Copy()方法 有一个重要区 别:Clone()方法会创建一个新 数组,而 Copy()方 法必须传 递 阶数 相同 且有 足够元素的己有数组。如果需要包含引用类型的数组的深层副本,就必须迭代数组并创建新对象。
3.排序:Amy类使用QuickSort算法对数组中 元素的 进行排序。 Sort()方法需要数组中的元素实 现ICommble接口 。 因为简单类型(如System.String和System.Int32)实现ICommble接 口 ,所 以 可以 对包含 这些 类型的元素进行排序。如果某个类的对象的排序方式与简单类型的排序方式不同,或者不能修改在数组中用作元素的类,就可以实现IComparer接口或IComparer<T>接口。这两个接口定义了方法COmpare()。要比较的类必须实现这两个接口之一。IComparer接口独立于要比较的类。这就是Compare()方法定义了两个要比较的参数的原因。其返回值与IComparer接口的CompareTo()方法类似 。
五、数组作为参数
数组可作为参数父老乡亲给方法,也可以从方法中返回。要返回一个数组,只需要把数组声明为返回类型。要把数组传递给方法,应把数组声明 为参数。
1.数组协变:数组支持协变,这表示数组可以声明为基类,其派生类型的元素可以赋予数组元素。数组协变只能用于引用类型,不能用于值类型。数组协变有一个问题,它只能通过运行时异常来解决。
2.ArraySegment<T>:表示数组的一段。如果某方法应返回数组的一部分,或者给某方法传递数组的一部分,就可以使用数组段。通过它可以只传递一个参数 ,而不是用3个参数传递数组,领偏移量和元素个数。在这个结构中,关于数组段的信息(偏移量和元素个数)包含在结构的成员中。数组段不复制原数组的元素,但原数组可以通过它访问。如果数组段中的元素改变了,这些变化就会反映到原数组中。
六、枚举
在 foreach语 句中使用枚举,可 以 迭代集合中的 元 素,且无需 知 道 集合中的 元素个数。
foEach语 句使 用了 一个枚 举器。数组或集合实现带GetEnumerator()方法的IEnumerable接口。GetEnumerator()方法返回一个实现Enumerable接口的枚举。接着,foreach语 句就可以 使 用 IEnumerable接口 迭代集合了。
1.IEnumerator接口:foreach语 句使用 IEnumerator接 口 的 方法和属性,迭代集合中的 所有元素。 为此, IEnumerator定 义了Current属性,来返回 光标所在的 元素,该接口 的MoveNext()方 法移动到集合的下一个元素上,如 果有这个元素,该方法就返回true。 如果集合不再有更多的元素,该方法就返回false。这个接口的泛型版本IEnumerator<T>派生自接口IDisposable,因此定义了Dispose()方法,来清理枚举器战胜的资源。IEnumerator接口还定义了Reset()方法,以与COM交互操作。许多.net枚举器通过抛出NotSupportedException类型的异常,来实现这个方法。
2.foreach语句:C#编译器会把foreach语句转换为IEnumerable接口的方法和属性。
3.yield语句
1)迭代集合的不同方式
2)用yield return 返回枚举器
七、元组
数组合 并了 相同 类型的 对象,而元组合并了 不同 类型的 对象。 元 组起 源于函 数 编程语言F# ,在这些语言中频繁使用元 组。.net4定义了8个泛型Tuple类 和一 个 静 态Tuple类 ,它们 用 作 元组的 工 厂。 这里 的 不同 泛 型 Tuple类支持不同 数 量的 元素。 例 如, Tuple<T1> 包含-个元 素, Tuple<T1,T2> 包含 两 个 元 素,以此 类推。如果元组包含的 项超过 8个 ,就可以 使用带 8个参数的Tuple类 定义。 最后一个模板参数是 TRest,表示必须给它传递一个元组。 这样,就可以 创建带任意个参数的元组了。
八、结构比较
数组和元组都实现接口IStructuralEquatable和IStructuralComparable。 这两个接口 都是.net4新增的,不仅可以比 较引 用,还可以比 较内 容。 这些接口 都是显式实现的,所 以 在使用时需要把数组和元组强制转 换 为这 个 接 口。IStructuralEquatable接 口用 于 比较 两 个 元 组 或 数 组 是 否 有 相 同 的 内容 ,IStructuralComparable 接 口 用于给元组或数组排序。
数组/元组的排序和比较
后面没太细看。以后用到的时候再查吧~~
来源:https://www.cnblogs.com/gdx4430090/p/3166787.html