C#新建数组

来源:互联网 发布:手机网络电视直播大全 编辑:程序博客网 时间:2024/06/06 03:24
            int[] num = { 1,2,3,4,5,6,7};
            int [] num1=new int[10];            num1[2] = 9;

            int[] in1 = { 1, 2, 3, 4, 65, 4, 3, 2, 25, 15123, 53 };            var arr = new int[] { 1, 2, 3, 4, 65, 4, 3, 2, 25, 15123, 53 };

数组创建可以包含许多对象或值的变量类型。但数组有一定的限制。最大的限制是一旦创建好数组,它们的大小就是固定的,不能在现有数组的末尾添加新项,除非创建一个新的数组。

集合类一般用于处理对象列表,其功能比简单数组要多,功能大多是通过实现System.Collections 名称空间中的接口而获得的,因此集合的语法已经标准化.

集合的功能(包括基本功能,例如,用[index]语法访问集合中的项)可以通过接口来实现,该接口不仅没有限制我们使用基本集合类,例如System.Array,相反,我们还可以创建自己的定制集合类。这些集合可以专用于要枚举的对象(即要从中建立集合的对象)。这么做的一个优点是定制的集合类可以是强类型化的。也就是说,从集合中提取项时,不需要把它们转换为正确的类型。另一个优点是提供专用的方法.

System.Collections 名称空间中的几个接口提供了基本的组合功能:
 IEnumerable 可以迭代集合中的项。
 ICollection(继承于IEnumerable)可以获取集合中项的个数,并能把项复制到一个简单的数组类型中。
 IList(继承于IEnumerable 和ICollection)提供了集合的项列表,允许访问这些项,并提供其他一些与项列表相关的基本功能。
 IDictionary(继承于IEnumerable 和ICollection)类似于IList,但提供了可通过键值(而不是索引)访问的项列表。


数组与集合的区别

对于简单的数组来说,只有用固定的大小来初始化数组,才能使用它。标准语法创建数组animalArray。
Animal[] animalArray = new Animal[2];
而ArrayList 集合不需要初始化其大小,所以可以使用以下代码创建列表animalArrayList:
ArrayList animalArrayList = new ArrayList();
这个类还有另外两个构造函数。第一个构造函数把现有的集合作为一个参数,把现有集合的内容复制到新实例中;而另一个构造函数通过一个参数设置集合的容量(capacity)。这个容量用一个int值指定,设置集合中可以包含的初始项数。但这并不是真实的容量,因为如果集合中的项数超过了这个值,容量就会自动增加一倍。

因为数组是引用类型(例如,Animal 和Animal 派生的对象),所以用一个长度初始化数组并没有初始化它所包含的项。要使用一个指定的项,该项还需要初始化,即需要给这个项赋予初始化了的对象。

ArrayList 集合可以用AddRange()方法一次添加好几个项。这个方法接受带有ICollection 接口的任何对象,包括前面的代码所创建的animalArray 数组:
animalArrayList.AddRange(animalArray);

迭代器

迭代器的定义是,它是一个代码块,按顺序提供了要在foreach 循环中使用的所有值。一般情况下,这个代码块是一个方法,但也可以使用属性访问器和其他代码作为为迭代器

无论代码块是什么,其返回类型都是有限制的。与期望正好相反,这个返回类型与所枚举的对象典型不同。两种可能的返回类型是前面提到的接口类型lIEnumerable 和IEnumerator。使用这两个类型的场合是:
 如果要迭代一个类,可使用方法GetEnumerator(),其返回类型是IEnumerator。
 如果要迭代一个类成员,例如一个方法,则使用IEnumerable。
在迭代器块中,使用yield 关键字选择要在foreach 循环中使用的值。其语法如下:
yield return <value>;

可以实现一个迭代器,来控制循环代码如何在其循环过程中取值。要迭代一个类,需要实现GetEnumerator()方法,其返回类型是IEnumerator。要迭代类的成员,例如方法,可以使用IEnumerable返回类型。在迭代器的代码块中,使用yield 关键字返回值


is 运算符的语法如下:
<operand> is <type>
这个表达式的结果如下:
 如果<type>是一个类类型,而<operand>也是该类型,或者它继承了该类型,或者它可以封箱到该类型中,则结果为true。
 如果<type>是一个接口类型,而<operand>也是该类型,或者它是实现该接口的类型,则结果为true。
 如果<type>是一个值类型,而<operand>也是该类型,或者它可以拆箱到该类型中,则结果为true。


IComparable 和IComparer 接口是.NET Framework 中比较对象的标准方式。这两个接口之间的差别如下:
 IComparable 在要比较的对象的类中实现,可以比较该对象和另一个对象。
 IComparer 在一个单独的类中实现,可以比较任意两个对象

一般使用IComparable 给出类的默认比较代码,使用其他类给出非默认的比较代码。IComparable 提供了一个方法CompareTo(),这个方法接受一个对象。

.NET Framework 在类Comparer 上提供了IComparer 接口的默认实现方式,类Comparer 位于
System.Collections 名称空间中,可以对简单类型以及支持IComparable 接口的任意类型进行特定文化的比较


as 运算符使用下面的语法,把一种类型转换为指定的引用类型:
<operand> as <type>
这只适用于下列情况:
 <operand>的类型是<type>类型
 <operand>可以隐式转换为<type>类型
 <operand>可以封箱到<type>类型中
如果不能从<operand>转换为<type>,则表达式的结果就是null。




原创粉丝点击